我有包含以下数据的 pandas 数据框
Id Voter Vote
123 A Positive
123 B Negative
123 C Positive
223 A Negative
223 B Positive
223 C Neutral
223 D Negative
对于上面的数据框,我需要一个像这样的旋转输出
Id Winner Confidence
123 Postive 2/3
223 Negative 2/4
为了便于阅读,我将 Confidence 列值保留为分数,它们可以是 2/3 = 0.667 和 2/4 = .5
置信度值是根据给予获胜者的获胜选票计算得出的。 例如,id=123 在总共 3 票中有两票赞成,因此它有 2/3 的置信度。
如果它变得容易,总会有赢家。
附言我是 python 的新手,所以对您的解决方案的任何解释都会有所帮助。
请您参考如下方法:
看来你需要crosstab带参数 normalize:
df = pd.crosstab(df['Id'], df['Vote'], normalize=0)
print (df)
Vote Negative Neutral Positive
Id
123 0.333333 0.00 0.666667
223 0.500000 0.25 0.250000
但是如果需要不同的结构使用:
-
groupby+size用于计算Id和Vote 列的所有组合
groupby+transform按Id求和
- 除以
div与reset_index
df1 = df.groupby(['Id','Vote']).size()
print (df1)
Id Vote
123 Negative 1
Positive 2
223 Negative 2
Neutral 1
Positive 1
dtype: int64
df2 = df1.groupby(level='Id').transform('sum')
print (df2)
Id Vote
123 Negative 3
Positive 3
223 Negative 4
Neutral 4
Positive 4
dtype: int64
df3 = df1.div(df2).reset_index(name='col')
print (df3)
Id Vote col
0 123 Negative 0.333333
1 123 Positive 0.666667
2 223 Negative 0.500000
3 223 Neutral 0.250000
4 223 Positive 0.250000
