pandas自定义idxmax()函数,具有特殊的平等处理

时间:2016-10-30 17:34:02

标签: 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         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认为两个值相等,并给出“等于”?

1 个答案:

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