Python 具有等式特殊处理的自定义idxmax()函数

Python 具有等式特殊处理的自定义idxmax()函数,python,pandas,Python,Pandas,我正在处理一个csv文件,里面有选举数据。我的原始样本可以表示为: city party1 party2 party3 0 city1 50 107 114 1 city2 181 323 326 2 city3 26 28 75 3 city4 32 47

我正在处理一个csv文件,里面有选举数据。我的原始样本可以表示为:

        city      party1     party2     party3
   0    city1     50         107        114
   1    city2     181        323        326
   2    city3     26         28         75
   3    city4     32         47         59
   4    ciy5      8          21         21
我使用pandas的idxmax()函数创建了一个名为“winner”的新列,如下所示:

 mydf['winner'] = mydf[['party1','party2','party3']].idxmax(axis=1)
我的目标是确定哪个政党在每个城市中处于第一位。结果如下:

        city      party1     party2     party3      winner
   0    city1     50         107        114         party3
   1    city2     181        323        326         party3
   2    city3     26         28         75          party3
   3    city4     32         47         59          party3
   4    ciy5      8          21         21          party2
由于第2方和第3方的得分相同,所以获胜者最后一次原始数据的值为假

是否可以在函数idxmax中包含一个异常,该函数考虑两个值的相等并给出“相等”?

您可以使用每行的值比较
子集
,然后是它们,其中值更高,因为
1
存在最大重复项。因此,可以使用掩码
s>1
覆盖
idxmax
的值:

a = mydf[['party1','party2','party3']]
mydf['winner'] = a.idxmax(axis=1)

s = a.eq(a.max(axis=1), axis=0).sum(axis=1)
print (s)
0    1
1    1
2    1
3    1
4    2
dtype: int64

mydf['winner'] = mydf['winner'].mask(s > 1, 'Equality')
print (mydf)
    city  party1  party2  party3    winner
0  city1      50     107     114    party3
1  city2     181     323     326    party3
2  city3      26      28      75    party3
3  city4      32      47      59    party3
4   ciy5       8      21      21  Equality
如果还需要按列的值对df进行多次赋值,则通过以下方式应用
加入
并最后删除,:


那么,winner列中的值应该是多少?字符串party2和party3的串联?从个人角度来说,类似“equality”的东西应该是最好的!你需要更明确地表达你想要得到什么。您需要一个定制的
idxmax
,它知道它要查看多少级别(这可能会因列而异)。然后生成上下文敏感标签。说句俏皮话,这只是第2、3方之间的“平等”,而不是第1方之间的“平等”。(我称之为“Tie”而不是“Equality”)你好,jezrael,我非常小心地尝试了每个步骤后的第一个解决方案,但是我遇到了这个错误:TypeError:mask()接受2个位置参数,但给出了3个:-/…你的pandas版本是什么?得到了0.14.1(我的laptob在Debian上运行)。太旧了,不能使用遮罩功能?我觉得有问题。最后一个版本是
0.19.0
Ok,我将检查如何更新我的资料。。。非常感谢你!
a = mydf[['party1','party2','party3']]
df = a.eq(a.max(axis=1), axis=0)
print (df)
  party1 party2 party3
0  False  False   True
1  False  False   True
2  False  False   True
3  False  False   True
4  False   True   True

mydf['winner'] = df.mul(df.columns.to_series())
                   .apply(','.join, axis=1)
                   .str.strip(',')
print (mydf)
    city  party1  party2  party3         winner
0  city1      50     107     114         party3
1  city2     181     323     326         party3
2  city3      26      28      75         party3
3  city4      32      47      59         party3
4   ciy5       8      21      21  party2,party3