【问题标题】:Pandas merging value of two rows in columns of a single row熊猫合并单行列中两行的值
【发布时间】:2023-02-05 16:24:09
【问题描述】:
我有这样的数据,它是一个的输出通过...分组:
numUsers = df.groupby(["user","isvalid"]).count()
count
user isvalid
5 0.0 1336
1.0 387
但我需要数计数有效和计数无效每个用户的列,如下所示:
count_valid count_invalid
user
5 387 1336
我怎样才能在 Pandas 中以优化的方式做到这一点?
【问题讨论】:
标签:
python
pandas
aggregate
【解决方案1】:
您可以使用:
out = (df.groupby(["user","isvalid"]).count()
.rename({0: 'count_invalid', 1: 'count_valid'}, level=1)
['count'].unstack()
)
输出:
isvalid count_invalid count_valid
user
5 1336 387
或者,如果您有多个列,则使用 MultiIndex 更通用:
out = (df.groupby(["user","isvalid"]).count()
.unstack().rename(columns={0: 'invalid', 1: 'valid'}, level=1)
)
out.columns = out.columns.map('_'.join)
输出:
count_invalid count_valid
user
5 1336 387
或者来自带有 crosstab 的原始数据集:
pd.crosstab(df['user'], df['isvalid'].map({0: 'count_invalid', 1: 'count_valid'}))
【解决方案2】:
您可以将groupby_count替换为value_counts:
>>> (df.replace({'isvalid': {0: 'count_invalid', 1: 'count_valid'}})
.value_counts(['user', 'isvalid']).unstack('isvalid')
.rename_axis(columns=None))
count_invalid count_valid
user
5 1336 387
pivot_table 的另一个版本:
>>> (df.replace({'isvalid': {0: 'count_invalid', 1: 'count_valid'}}).assign(count=1)
.pivot_table(index='user', columns='isvalid', values='count', aggfunc='count')
.rename_axis(columns=None))
count_invalid count_valid
user
5 1336 387