问题描述
在下面执行此代码会产生奇怪的结果。本质上,当将数据帧缝合在一起以给出最终结果时,通过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
如果我切换行和列,则可以。 (尽管索引的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
解决方法
我不确定您的代码在做什么,但是我会采用另一种方法:
- 您可以遍历
one
和two
列名 - 然后,使用
df[col,'zero'] = 0
创建一个新的多索引列。 - 最后,要根据需要重组列,可以使用
.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