猿问

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

所以我用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)

我得到以下数据框


       C3

C1 C2    

x  a   10

   b   11

y  a   12

   b   13

z  a   14

   b   15

我也有一个具有相同索引的系列C2:


series = pd.Series([100], index=['a'])

我想将此系列分配给一个新列C4,仅分配给“ x”第一个索引。如果使用.assign,它会工作,但会返回一个副本:


df.loc['x'].assign(C4=series)

我得到


    C3     C4

C2           

a   10  100.0

b   11    NaN

但我无法将其分配给原始数据


df.loc['x'] = df.loc['x'].assign(C4=series)

产量


         C3

C1 C2      

x  a    NaN

   b    NaN

如果使用这样的赋值,我将得到相同的结果:


df.loc['x', 'C4'] = series

但是它会产生NaN。


         C3  C4

C1 C2          

x  a    NaN NaN

   b    NaN NaN

y  a   12.0 NaN

   b   13.0 NaN

z  a   14.0 NaN

   b   15.0 NaN

如何以这种方式分配?


宝慕林4294392
浏览 156回答 2
2回答

慕仙森

我想将此系列分配给新列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.nanprint(df)       C3     C4C1 C2           x  a   10  100.0   b   11    NaNy  a   12    NaN   b   13    NaNz  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)

饮歌长啸

你可以去pd.IndexSlice即df.loc[pd.IndexSlice['x',series.index.tolist()],'C4']  = series.values       C3     C4C1 C2           x  a   10  100.0   b   11    NaNy  a   12    NaN   b   13    NaNz  a   14    NaN   b   15    NaN
随时随地看视频慕课网APP

相关分类

Python
我要回答