如何解决如何基于两列的条件求和并使用Pandas以交叉表格式呈现?
给出以下数据框:
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
请问这是否可以直接使用pandas crosstab来实现?
p.s。,类似但不同的主题已单独讨论here。请让我知道该线程是否被视为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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。