为了账号安全,请及时绑定邮箱和手机立即绑定

熊猫将系列分配给新列以进行多索引

熊猫将系列分配给新列以进行多索引

宝慕林4294392 2021-03-29 08:55:39
所以我用MultiIndex创建一个数据框df = pd.DataFrame({    'C1': ['x', 'x', 'y', 'y', 'z', 'z'],    'C2': ['a', 'b', 'a', 'b', 'a', 'b'],    'C3': [10, 11, 12, 13, 14, 15]})df.set_index(['C1', 'C2'], inplace=True)我得到以下数据框       C3C1 C2    x  a   10   b   11y  a   12   b   13z  a   14   b   15我也有一个具有相同索引的系列C2:series = pd.Series([100], index=['a'])我想将此系列分配给一个新列C4,仅分配给“ x”第一个索引。如果使用.assign,它会工作,但会返回一个副本:df.loc['x'].assign(C4=series)我得到    C3     C4C2           a   10  100.0b   11    NaN但我无法将其分配给原始数据df.loc['x'] = df.loc['x'].assign(C4=series)产量         C3C1 C2      x  a    NaN   b    NaN如果使用这样的赋值,我将得到相同的结果:df.loc['x', 'C4'] = series但是它会产生NaN。         C3  C4C1 C2          x  a    NaN NaN   b    NaN NaNy  a   12.0 NaN   b   13.0 NaNz  a   14.0 NaN   b   15.0 NaN如何以这种方式分配?
查看完整描述

2 回答

?
慕仙森

TA贡献1827条经验 获得超8个赞

我想将此系列分配给新列C4,仅分配给“ x”第一个索引。


一种方法是从索引级别映射序列。关键方法是pd.Index.get_level_values。然后覆盖到NaN不需要映射的位置。


f['C4'] = df.index.get_level_values(1).map(series.get)

df.loc[df.index.get_level_values(0) != 'x', 'C4'] = np.nan


print(df)


       C3     C4

C1 C2           

x  a   10  100.0

   b   11    NaN

y  a   12    NaN

   b   13    NaN

z  a   14    NaN

   b   15    NaN

另外,您可以使用numpy.where:


df['C4'] = np.where(df.index.get_level_values(0) == 'x',

                    df.index.get_level_values(1).map(series.get),

                    np.nan)


查看完整回答
反对 回复 2021-04-13
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

你可以去pd.IndexSlice即


df.loc[pd.IndexSlice['x',series.index.tolist()],'C4']  = series.values


       C3     C4

C1 C2           

x  a   10  100.0

   b   11    NaN

y  a   12    NaN

   b   13    NaN

z  a   14    NaN

   b   15    NaN


查看完整回答
反对 回复 2021-04-13
  • 2 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号