【发布时间】:2022-09-27 14:00:42
【问题描述】:
我已经使用下面的代码计算了条件概率。现在我想将此计算的结果作为新列添加到我的数据框中。使用此代码可以实现吗?
df.groupby([\'mode\',\'income_level\'])[\'service\'].value_counts() / df.groupby([\'mode\',\'income_level\'])[\'service\'].count()
我已经使用下面的代码计算了条件概率。现在我想将此计算的结果作为新列添加到我的数据框中。使用此代码可以实现吗?
df.groupby([\'mode\',\'income_level\'])[\'service\'].value_counts() / df.groupby([\'mode\',\'income_level\'])[\'service\'].count()
如果您的解决方案需要新列,请使用 DataFrame.join:
df = pd.DataFrame({'mode':list('aaaabbbb'),
'income_level':[5,5,5,0,5,0,0,0],
'service':[1,0] * 4})
a = (df.groupby(['mode','income_level'])['service'].value_counts() /
df.groupby(['mode','income_level'])['service'].count())
df = df.join(a.rename('new1'), on=['mode','income_level', 'service'])
或者使用GroupBy.transform,而不是value_counts 将列添加到groupby 并使用GroupBy.size:
s1 = df.groupby(['mode','income_level', 'service'])['service'].transform('size')
s2 = df.groupby(['mode','income_level'])['service'].transform('count')
df['new'] = s1 / s2
print (df)
mode income_level service new1 new
0 a 5 1 0.666667 0.666667
1 a 5 0 0.333333 0.333333
2 a 5 1 0.666667 0.666667
3 a 0 0 1.000000 1.000000
4 b 5 1 1.000000 1.000000
5 b 0 0 0.666667 0.666667
6 b 0 1 0.333333 0.333333
7 b 0 0 0.666667 0.666667
【讨论】: