我有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
Run Code Online (Sandbox Code Playgroud)
对于上面的数据框,我需要像这样的旋转输出
Id Winner Confidence
123 Postive 2/3
223 Negative 2/4
Run Code Online (Sandbox Code Playgroud)
我将Confidence列值保留为一个分数,以便于阅读,它们可以2/3 = 0.667和2/4 = .5
置信度值是根据获胜者的获胜投票计算的.例如,id = 123在总共3票中有两张正票,因此它有2/3的置信度.
如果它变得容易,总会有胜利者.
PS我是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
Run Code Online (Sandbox Code Playgroud)
但如果需要不同的结构用途:
groupby+ size用于计算列的所有组合Id和Votegroupby+ transform总和Iddiv用reset_indexdf1 = 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
Run Code Online (Sandbox Code Playgroud)