我有一个数据框,为了避免元组列名,我故意使用空白级别:
>>> df
user1 user2 count
0 1 2
a a b a
0 2 6 0 1 0 0
1 4 6 0 0 0 3
2 21 76 2 0 1 0
3 5 18 0 0 0 0
请注意,user1
和user2
与count
处于同一级别(合并的副作用)。
我想创建一个新列(也许在count
下?),该列取所有1
和2
的总和( 0
不包括在内!)。那将意味着:
>>> df
user1 user2 count
0 1 2 sum_1_2
a a b a a b
0 2 6 0 1 0 0 1+0 0
1 4 6 0 0 0 3 0 0+3
2 21 76 2 0 1 0 0 0
3 5 18 0 0 0 0 0 0
我已经基于this thread尝试了df.groupby(level=[0,2]).sum()
,但是它们没有给我想要的结果(它们的总和中还包含0
列,它们也总和{ {1}}和user1
)。
发电机代码:
user2
答案 0 :(得分:1)
首先使用slicers仅过滤1,2
,然后使用sum
并添加与原始DataFrame
相同级别的级别,以可能使用concat
:
idx = pd.IndexSlice
df3 = final_df.loc[:, idx[:, [1,2],:]].sum(level=2, axis=1)
df3.columns = pd.MultiIndex.from_product([['count'], ['sum_1_2'], df3.columns])
print (df3)
count
sum_1_2
a b
0 1.0 0.0
1 0.0 0.0
2 0.0 1.0
3 3.0 0.0
df = pd.concat([final_df, df3], axis=1)
print (df)
user1 user2 count
0 1 2 sum_1_2
a a b a a b
0 2 6 0.0 1.0 0.0 0.0 1.0 0.0
1 5 18 0.0 0.0 0.0 0.0 0.0 0.0
2 21 76 2.0 0.0 1.0 0.0 0.0 1.0
3 4 6 0.0 0.0 0.0 3.0 3.0 0.0
详细信息:
print (final_df.loc[:, idx[:, [1,2],:]])
count
1 2
a b a
0 1.0 0.0 0.0
1 0.0 0.0 0.0
2 0.0 1.0 0.0
3 0.0 0.0 3.0