【问题标题】:Pandas assign series to new column to multiindex熊猫将系列分配给多索引的新列
【发布时间】:2018-12-02 04:06:48
【问题描述】:

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

我怎样才能以这种方式分配?

【问题讨论】:

  • 你不能修改你的系列来拥有 MultiIndex 吗? (series.index = pd.MultiIndex.from_product([('x',), series.index])) 如果可能,df['C4'] = series 应该可以正常工作。
  • 是的,我可以。感谢您富有洞察力的回答

标签: python pandas dataframe indexing series


【解决方案1】:

你可以去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

【讨论】:

    【解决方案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.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)
    

    【讨论】:

    • 我实际上更喜欢np.where 解决方案!谢谢
    猜你喜欢
    • 2023-01-20
    • 2015-04-14
    • 2018-03-25
    • 2014-07-11
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    相关资源
    最近更新 更多