python - Pandas:对于 df 中的每一行,计算该值在另一列中存在的次数

标签 python pandas

我有以下数据框。

>>> df = pd.DataFrame({'selected': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'D'], 'presented': ['A|B|D', 'B|D|A', 'A|B|C', 'D|C|B|A','A|C|D|B', 'D|B|C','D|C|B|A','D|B|C']})
>>> df

这是一个大型数据集,有 500K 行(为了简化示例,删除了日期列)

  selected presented
0        A     A|B|D
1        B     B|D|A
2        C     A|B|C
3        A   D|C|B|A
4        B   A|C|D|B
5        C     D|B|C
6        A   D|C|B|A
7        D     D|B|C

目标是计算所选列中每个项目的选择/呈现 比率。示例 A 出现了 8 次,但在出现的 8 次中它只被选中了 6 次给用户。

我想创建以下结果 data.frame:

item, selected, presented, ratio
A, 3, 6, 0.5
B, 2, 8, 0.25

我从跟随开始,但无法弄清楚分组,因为如果我只是按 selected 分组并开始计数,它只会捕获它显示的时间。

>>> df['ratio'] = df.apply(lambda x:1 if x.selected in x.presented.split('|') else 0, axis=1)
>>> df
  selected presented  ratio
0        A     A|B|D      1
1        B     B|D|A      1
2        C     A|B|C      1
3        A   D|C|B|A      1
4        B   A|C|D|B      1
5        C     D|B|C      1
6        A   D|C|B|A      1
7        D     D|B|C      1

最佳答案

您可以使用get_dummies + value_counts,然后concat 结果

s1=df.presented.str.get_dummies('|').sum().to_frame('presented')
s2=df.selected.value_counts()
yourdf=pd.concat([s1,s2],1,sort=True)
yourdf['ratio']=yourdf['selected']/yourdf['presented']

yourdf
Out[488]: 
   presented  selected     ratio
A          6         3  0.500000
B          8         2  0.250000
C          6         2  0.333333
D          7         1  0.142857

关于python - Pandas:对于 df 中的每一行,计算该值在另一列中存在的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55404895/

相关文章:

python - 为什么我不能绘制选定的点?

python - 二进制文件转python整数列表

python - DataFrame 中行之间的二元运算

python - 值错误 - Python Django

python - cx_freeze 的 exe 错误

python - Dask groupby 索引列

python - 错误消息 : replace with Series. 滚动(窗口=5).corr(其他=<系列>)

python - 通过附加不同大小的列将多个 csv 文件读取到 Pandas 数据框中

python - 如何在操作后保留 Pandas 列的前导零?

python - 获取每个元素出现的最快方法