我的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
我将“置信度”列值作为一个分数,以便于阅读,它们可以是2/3 = 0.667
和2/4 = .5
置信度值是根据获胜者投票给出的。 例如,id = 123在总共3票中有两张正票,因此它有2/3的置信度。
如果它变得容易,总会有胜利者。
P.S。我是python的新手,所以对你的解决方案的任何解释都会有所帮助。
答案 0 :(得分:5)
您似乎需要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
答案 1 :(得分:1)
首先,您需要添加一个新的列,该列将具有Vote - 1的数值。
# data_frame => Given Data_Frame of the form-
Id Voter Vote
123 A Positive
123 B Negative
123 C Positive
223 A Negative
223 B Positive
223 C Neutral
223 D Negative
data_frame['Vote_Numeric'] = data_frame['Vote'].map(lambda x: 1)
给出 -
Id Vote Voter Vote_Numeric
0 123 Positive A 1
1 123 Negative B 1
2 123 Positive C 1
3 223 Negative A 1
4 223 Positive B 1
5 223 Neutral C 1
6 223 Negative D 1
现在,在data_frame上使用pivot_table,我们将拥有一个新的框架,其中包含列Id,正面,负面,中性,以及每个Id每列下的总投票总数
df_pivot = data_frame.pivot_table('Vote_Numeric', index='Id', columns='Vote', aggfunc=np.sum)
给出 -
Vote Negative Neutral Positive
Id
123 1.0 NaN 2.0
223 2.0 0.0 1.0
现在我们需要添加一个列,根据哪个列保存每个id的最大数值来决定获胜者 -
df_pivot= df_pivot.fillna(0)
df_pivot['winner'] = df_pivot.idxmax(axis=1)
给出 -
Vote Negative Neutral Positive winner
Id
123 1.0 0.0 2.0 Positive
223 2.0 1.0 1.0 Negative
现在要获得置信度值,将三个值(正,负和中性)中的最大值除以所有三列的总和,以获得新的列置信度 -
df_pivot['confidence'] = df_pivot.max(axis=1, numeric_only=True)/df_pivot.sum(axis=1,numeric_only=True)
结果 -
Vote Negative Neutral Positive winner confidence
Id
123 1.0 0.0 2.0 Positive 0.666667
223 2.0 1.0 1.0 Negative 0.500000