我有以下数据框df
:
名字 | 地位 |
---|---|
约翰 | 完全的 |
詹姆士 | 去做 |
吉尔 | 去做 |
罗伯特 | 进行中 |
吉尔 | 去做 |
吉尔 | 去做 |
码头 | 完全的 |
艾薇 | 完全的 |
艾薇 | 完全的 |
现在我想要每个用户的每种状态的计数。对于所有类型的状态,我都可以得到这样的结果。
df = pd.crosstab(df.names,df.status).reset_index("names")
所以现在结果df
是
地位 | 名字 | 完全的 | 进行中 | 去做 |
---|---|---|---|---|
0 | 詹姆士 | 0 | 0 | 1 |
1 | 罗伯特 | 0 | 1 | 0 |
2 | 约翰 | 1 | 0 | 0 |
3 | 码头 | 1 | 0 | 0 |
4 | 吉尔 | 0 | 0 | 3 |
5 | 艾薇 | 2 | 0 | 0 |
所以我的问题是如何仅指定要计算的特定类型的状态值?例如:我只想要In Progress
andCompleted
和 not的值To Do
。以及如何向上面称为 as 的额外列添加一个额外的列Total Statuses
,这实际上是原始数据框中每个名称的总行数?
所需的数据帧:
地位 | 名字 | 完全的 | 进行中 | 全部的 |
---|---|---|---|---|
0 | 詹姆士 | 0 | 0 | 1 |
1 | 罗伯特 | 0 | 1 | 1 |
2 | 约翰 | 1 | 0 | 1 |
3 | 码头 | 1 | 0 | 1 |
4 | 吉尔 | 0 | 0 | 3 |
5 | 艾薇 | 2 | 0 | 2 |
其它的办法:
传入margins
和margins_name
参数pd.crosstab()
:
df=(pd.crosstab(df.names,df.status,margins=True,margins_name='Total').iloc[:-1]
.reset_index().drop('To Do',1))
或者
通过crosstab()
+assign()
df=(pd.crosstab(df.names,df.status).assign(Total=lambda x:x.sum(1))
.reset_index().drop('To Do',1))
或者
分两步:
df=pd.crosstab(df.names,df.status)
df=df.assign(Total=df.sum(1)).drop('To Do',1).reset_index()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句