【问题标题】:Pandas: breaking ties for mode熊猫:打破模式的关系
【发布时间】:2021-09-20 16:42:58
【问题描述】:

当 mode() 返回多个值时,即在多模式分布中,是否有一种巧妙的方法来打破关系。对于上下文,我正在实施一个投票系统,我想以一种自定义的、非随机的方式打破联系。

在下面的人工示例中,我想要每一行的模式,但如果有多种模式,我希望选择名称最短的模式。

import pandas as pd
import random

random.seed(0)

fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry', 'fig']
d = pd.DataFrame(
    {c : [random.choice(fruits)
          for _ in range(10)]
     for c in "ABCDEF"}
)

print(d,"\n")
print(d.mode(axis=1))

输出显示初始数据帧和pandas.DataFrame.mode()的默认输出

            A           B           C           D           E           F
0        date  elderberry         fig  elderberry        date         fig
1        date      banana  elderberry       apple  elderberry         fig
2       apple  elderberry      banana      cherry      cherry       apple
3      cherry      banana      cherry        date       apple  elderberry
4  elderberry      cherry       apple      cherry  elderberry        date
5        date      banana         fig  elderberry       apple      cherry
6        date       apple       apple         fig       apple      banana
7      cherry  elderberry         fig      banana         fig         fig
8        date      cherry      cherry  elderberry        date      cherry
9      cherry  elderberry        date        date         fig         fig 

            0           1       2     3           4    5
0        date  elderberry     fig   NaN         NaN  NaN
1  elderberry         NaN     NaN   NaN         NaN  NaN
2       apple      cherry     NaN   NaN         NaN  NaN
3      cherry         NaN     NaN   NaN         NaN  NaN
4      cherry  elderberry     NaN   NaN         NaN  NaN
5       apple      banana  cherry  date  elderberry  fig
6       apple         NaN     NaN   NaN         NaN  NaN
7         fig         NaN     NaN   NaN         NaN  NaN
8      cherry         NaN     NaN   NaN         NaN  NaN
9        date         fig     NaN   NaN         NaN  NaN

我已经发布了我自己的尝试作为答案,但是有没有更简洁的方法来做到这一点?在任何情况下,我希望它可以帮助其他有同样问题的人。

【问题讨论】:

  • 得到mode后,想用某个自定义函数将非NaN元素连续排序,这样理解对吗? :)
  • 是的@zabop,下面是我的尝试,但我想知道是否有更好的方法。

标签: python pandas statistics


【解决方案1】:

在我的尝试中,我在每一行上使用 apply() 来收集所有模式值(首先删除 NA),然后使用我自己的(名称长度)分数作为 python 的 @987654323 的 key 参数进行自定义排序@。第一项就是我们想要的。当然,此解决方案不处理“有两个相同长度的模态值是什么?”,但可以根据任何给定场景的需要开发 tiebreaker 功能。

def myscore(fruitname):
    return len(fruitname)

def breakties(row):
    modes = list(row.dropna())
    return sorted(modes, key=myscore)[0]

print("Mode with ties broken")
print(d.mode(axis=1).apply(breakties, axis=1))

print("OR, more succinctly")
print(
    d.mode(axis=1).apply(
        lambda row: sorted(list(row.dropna()),key=lambda v:len(v))[0],
        axis=1
    )
)
Mode with ties broken
0           fig
1    elderberry
2         apple
3        cherry
4        cherry
5           fig
6         apple
7           fig
8        cherry
9           fig
dtype: object
OR, more succinctly
0           fig
1    elderberry
2         apple
3        cherry
4        cherry
5           fig
6         apple
7           fig
8        cherry
9           fig
dtype: object```

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2014-04-19
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多