给定以下数据帧:
Name Activity Hour Month
A TT 5 1
A TT 2 1
A UU 1 1
A UU 1 2
A UU 1 3
B TT 40 3
C UU 10 1
D TT 2 2
D TT 2 2
D TT 2 2
D TT 5 1
下一步是如果行具有相同的列Name
和Activity
的值,则获得求和。
例如,对于Name: A
和Activity: TT
的情况,将给出7
的总和
然后,我想以交叉选项卡格式呈现它,该格式根据month
和activity
分组,如下所示
Month
1 2 3
TT UU TT UU TT UU
A 7 1 0 1 0 1
B 0 0 0 0 40 0
C 0 10 0 0 0 0
D 5 0 6 0 0 0
我可以知道这是否可以直接使用熊猫交叉表实现吗?
附言,相似但不同的话题在这里分别讨论。请让我知道这个线程是否被认为是OP 的副本
考虑以下df:
In [93]: df
Out[93]:
Name Activity Hour Month
0 A TT 5 1
1 A TT 2 1
2 A UU 1 1
3 A UU 1 2
4 A UU 1 3
5 B TT 40 3
6 C UU 10 1
7 D TT 2 2
8 D TT 2 2
9 D TT 2 2
10 D TT 5 1
解决方案:1如果你想使用pd.crosstab
,你可以这样做:
In [92]: pd.crosstab(df.Name, columns=[df.Month, df.Activity], values=df.Hour, aggfunc='sum').fillna(0)
Out[92]:
Month 1 2 3
Activity TT UU TT UU TT UU
Name
A 7.0 1.0 0.0 1.0 0.0 1.0
B 0.0 0.0 0.0 0.0 40.0 0.0
C 0.0 10.0 0.0 0.0 0.0 0.0
D 5.0 0.0 6.0 0.0 0.0 0.0
解决方案:2您可以使用df.pivot_table
:
In [89]: df.pivot_table(index='Name', columns=['Month', 'Activity'], values='Hour', aggfunc='sum', fill_value=0)
Out[89]:
Month 1 2 3
Activity TT UU TT UU TT UU
Name
A 7 1 0 1 0 1
B 0 0 0 0 40 0
C 0 10 0 0 0 0
D 5 0 6 0 0 0
您也可以使用groupby
作为您之前的问题
df_final = df.groupby(['Month','Activity','Name']).Hour.sum().unstack([0,1], fill_value=0)
Out[338]:
Month 1 2 3
Activity TT UU TT UU TT UU
Name
A 7 1 0 1 0 1
B 0 0 0 0 40 0
C 0 10 0 0 0 0
D 5 0 6 0 0 0