我正在处理一个充满选举数据的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认为两个值相等,并给出“等于”?
答案 0 :(得分:5)
您可以使用DataFrame.eq
比较subset
每行DataFrame.max
个值,然后sum
个值,其中值更高为1
最多重复一次。因此,可以使用掩码idxmax
覆盖s > 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
的值:
df
如果需要按mask
的列值对多个apply
进行评估,则join
,
最后按mul
删除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
:
{{1}}