【问题标题】:Pandas. Copy multiIndex level熊猫。复制多索引级别
【发布时间】:2019-05-03 21:13:06
【问题描述】:

我有一个带有多索引列的 DataFrame:

df = pd.DataFrame(np.arange(12).reshape(3,-1))
df.columns = [['A', 'A', 'B', 'B'], [0, 1, 0, 1]]
print(df)

看起来像这样:

   A      B    
   0  1   0   1
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11

我想做类似df['C'] = df['B'] 的事情来获得:

    A       B       C    
    0   1   0   1   0   1
0   0   1   2   3   2   3
1   6   7   8   9   8   9
2  12  13  14  15  14  15

我收到了ValueError: Wrong number of items passed 2, placement implies 1

我也尝试过df.loc[:, slice('C', None)] = df['B'],但没有成功。

其实我的情况稍微复杂一点:我在多索引中多了一层(L0 I),我想将df['L0 I', 'B']复制到df['L0 II', 'B']L0 II不存在)。

【问题讨论】:

    标签: python pandas dataframe multi-index


    【解决方案1】:

    您可以简单地提取一列,同时使用df[['B']] 保留MultiIndex

    所以使用这个和concat 的一个非常简单的解决方案是:

    df = pd.concat([df, df[['B']].rename(columns={'B': 'C'})], axis=1)
    print(df)
       A      B       C    
       0  1   0   1   0   1
    0  0  1   2   3   2   3
    1  4  5   6   7   6   7
    2  8  9  10  11  10  11
    

    【讨论】:

      【解决方案2】:

      您可以提取列并在列中创建MultiIndex

      df1 = df['B']
      df1.columns = [['C'] * len(df1.columns), df1.columns]
      print (df1)
          C    
          0   1
      0   2   3
      1   6   7
      2  10  11
      

      或者按切片和rename一级选择:

      df1 = df.loc[:, slice('B', None)].rename(columns={'B':'C'}, level=0)
      print (df1)
          C    
          0   1
      0   2   3
      1   6   7
      2  10  11
      

      然后joinconcat 一起:

      df = df.join(df1)
      #alternative
      #df = pd.concat([df,df1], axis=1)
      print (df)
         A      B       C    
         0  1   0   1   0   1
      0  0  1   2   3   2   3
      1  4  5   6   7   6   7
      2  8  9  10  11  10  11
      

      这里工作的另一个解决方案是使用DataFrame.stack,使用DataFrame.assign 复制列并通过DataFrame.unstack 重新整形:

      df1 = df.stack().assign(C = lambda x: x['B']).unstack()
      print (df1)
         A      B       C    
         0  1   0   1   0   1
      0  0  1   2   3   2   3
      1  4  5   6   7   6   7
      2  8  9  10  11  10  11
      

      【讨论】:

      • 不知何故我没有想到 concat。简单的。谢谢)
      • @avloss - 添加了另一个解决方案,我希望对你有用。
      猜你喜欢
      • 1970-01-01
      • 2013-12-04
      • 2020-12-05
      • 1970-01-01
      • 2023-04-02
      • 2018-08-24
      • 2017-09-21
      相关资源
      最近更新 更多