在python

时间:2017-05-22 08:30:33

标签: python pandas

我的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.6672/4 = .5

置信度值是根据获胜者投票给出的。 例如,id = 123在总共3票中有两张正票,因此它有2/3的置信度。

如果它变得容易,总会有胜利者。

P.S。我是python的新手,所以对你的解决方案的任何解释都会有所帮助。

2 个答案:

答案 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

但如果需要不同的结构使用:

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