python - 如何根据两列的条件求和并使用 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来实现?
ps,类似但不同的主题已在此处单独讨论。请让我知道这个线程是否被认为是 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
推荐阅读
- hybris - 如何在运行时更改自定义后台扩展的小部件配置?
- c# - 在 ASP.NET Core MVC 中,如何在视图中显示帖子创建者的用户名?
- reactjs - 如何创建一个根据 reactjsx 中的活动链接改变颜色的 NavBar?
- javascript - Vuetify TreeView 数据操作
- python - Python:计算极坐标中点的质心
- python - 1.7 LAB:通过 normalizing_zybook 调整列表中的值
- python - 使用子进程读取 adb shell 但我没有看到从 adb shell 返回的任何数据
- vba - 如何将组添加到 ListView?
- javascript - 如何为 dompdf Laravel 制作动画进度
- php - 从链接表中获取选中的复选框