Python 具有等式特殊处理的自定义idxmax()函数
我正在处理一个csv文件,里面有选举数据。我的原始样本可以表示为: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
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