我有以下数据框。
>>> 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
这是一个很大的数据集,具有50万行(为了使示例简单,取出了日期列)
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
目标是为所选列中的每个项目计算selected/presented
比率。示例A
被展示了8
次,但在向用户展示的6
次中仅被选择8
次。
我想创建以下结果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
答案 0 :(得分:6)
您可以使用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
答案 1 :(得分:2)
这种单线如何?
df['presented'].str.split('|', expand=True).stack().value_counts(sort=False).to_frame('presented')\
.assign(selected = df['selected'].value_counts())\
.eval('ratio = selected / presented')
输出:
presented selected ratio
A 6 3 0.500000
C 6 2 0.333333
B 8 2 0.250000
D 7 1 0.142857