首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向数据帧中添加百分比列

向数据帧中添加百分比列
EN

Stack Overflow用户
提问于 2017-04-06 21:50:05
回答 2查看 591关注 0票数 2

我有一只熊猫df如下所示:

代码语言:javascript
复制
User    Purchase_Count    Location_Count
1       2                 3
2       10                5
3       5                 1
4       20                4
5       2                 3
6       2                 3
7       10                5

如何添加计算总条目的坐标对(Purchse_Count[i], Location_Count[i]) %的列。因此,例如,我希望df看起来像:

代码语言:javascript
复制
User    Purchase_Count    Location_Count    %
1       2                 3                 42.85
2       10                5                 28.57
3       5                 1                 14.28
4       20                4                 14.28
5       2                 3                 42.85
6       2                 3                 42.85
7       10                5                 28.57
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-06 21:57:13

pandas解决方案是使用groupby,然后使用transform

代码语言:javascript
复制
In [43]: df
Out[43]:
   User  Purchase_Count  Location_Count
0     1               2               3
1     2              10               5
2     3               5               1
3     4              20               4
4     5               2               3
5     6               2               3
6     7              10               5

In [44]: total = len(df)

In [45]: df['percentage'] = df.groupby(['Purchase_Count', 'Location_Count']).transform(lambda r: r.count()/total)

In [46]: df
Out[46]:
   User  Purchase_Count  Location_Count  percentage
0     1               2               3    0.428571
1     2              10               5    0.285714
2     3               5               1    0.142857
3     4              20               4    0.142857
4     5               2               3    0.428571
5     6               2               3    0.428571
6     7              10               5    0.285714

编辑以提高可读性

代码语言:javascript
复制
In [53]: df['percentage'] = (df.groupby(['Purchase_Count', 'Location_Count'])
    ...:                     .transform(lambda r: r.count()/total))

In [54]: df
Out[54]:
   User  Purchase_Count  Location_Count  percentage
0     1               2               3    0.428571
1     2              10               5    0.285714
2     3               5               1    0.142857
3     4              20               4    0.142857
4     5               2               3    0.428571
5     6               2               3    0.428571
6     7              10               5    0.285714

编辑:

正如@piRSquared所建议的那样,您可以使用:

代码语言:javascript
复制
df.groupby(['Purchase_Count', 'Location_Count']).transform('count') / total

相反,初步测试表明它的速度要快得多。

票数 2
EN

Stack Overflow用户

发布于 2017-04-06 21:58:33

groupbysizejoin结合使用

代码语言:javascript
复制
cols = ['Purchase_Count', 'Location_Count']
df.join(df.groupby(cols).size().div(len(df)).rename('%'), on=cols)

   User  Purchase_Count  Location_Count         %
0     1               2               3  0.428571
1     2              10               5  0.285714
2     3               5               1  0.142857
3     4              20               4  0.142857
4     5               2               3  0.428571
5     6               2               3  0.428571
6     7              10               5  0.285714

旧答案

在元组上使用pd.value_counts

代码语言:javascript
复制
tups = df[['Purchase_Count', 'Location_Count']].apply(tuple, 1)
df.assign(**{'%': tups.map(pd.value_counts(tups, normalize=True))})

   User  Purchase_Count  Location_Count         %
0     1               2               3  0.428571
1     2              10               5  0.285714
2     3               5               1  0.142857
3     4              20               4  0.142857
4     5               2               3  0.428571
5     6               2               3  0.428571
6     7              10               5  0.285714

定时

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43266354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档