我正在处理一个充满选举数据的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
获胜者的最后一个原始值是假的,因为party2和party3具有相同的分数.
是否可以在函数中包含一个异常,idxmax考虑两个值的相等性并给出“等式”?
解决方法:
您可以将DataFrame.eq
用于比较子集,每行DataFrame.max
值,然后使用sum
,其中值更高为1,最多重复一次.那么可以使用掩码s>覆盖id00x的值到mask
. 1:
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
如果还需要在mul
之前按列值计算多个df,则在strip
之前应用join和last remove:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。