Pandas groupby忽略使用apply函数创建的列

问题描述

在下面执行此代码会产生奇怪的结果。本质上,当将数据帧缝合在一起以给出最终结果时,通过apply插入的列将被忽略。为什么会这样,我如何得到想要的结果?

# initialization and dataframe generation
import pandas as pd
from IPython.display import display

index = pd.MultiIndex.from_tuples(list(zip(*[['one','one','two','two'],['foo','bar','foo','bar']])))
df = pd.DataFrame(np.arange(12).reshape((3,4)),columns=index)
# actual code starts here
def new_zero(df):
    df.loc[:,(df.columns[0][0],'zero')] = 0      # MultiIndex column label necessary
    display(df) 
    return df

dd = df.groupby(level=0,axis=1).apply(new_zero)
dd

enter image description here

如果我切换行和列,则可以。 (尽管索引的0级是重复的):

def new_zero(df):
    df.loc[(df.index[0][0],'zero'),:] = 0
    display(df)
    return df

dd = df.T.groupby(level=0,axis=0).apply(new_zero)
dd

解决方法

我不确定您的代码在做什么,但是我会采用另一种方法:

  1. 您可以遍历onetwo列名
  2. 然后,使用df[col,'zero'] = 0创建一个新的多索引列。
  3. 最后,要根据需要重组列,可以使用.sort_index()并传递axis=1

    import pandas as pd
index = pd.MultiIndex.from_tuples(list(zip(*[['one','one','two','two'],['foo','bar','foo','bar']])))
df = pd.DataFrame(np.arange(12).reshape((3,4)),columns=index)
cols = list(set([col[0] for col in df.columns]))
for col in cols:
    df[col,'zero'] = 0
df = df.sort_index(axis=1,level=[0,1])
df = df[[('one','foo'),('one','bar'),'zero'),('two','zero')]]
df
Out[1]: 
  one          two         
  foo bar zero foo bar zero
0   0   1    0   2   3    0
1   4   5    0   6   7    0
2   8   9    0  10  11    0

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...