【问题标题】:Get the highest occurrence between 2 columns获取 2 列之间的最高出现次数
【发布时间】:2020-12-10 08:04:15
【问题描述】:

我有 2 列,分别称为 decision1 和 decision2。

我想比较它们以获得两者之间的最高出现率,所以我要么在决策 1 或决策 2 中获得最高出现率,要么根据最大的一个。到目前为止,我的尝试导致了这一点,但没有成功,因为我只是在 EACH 列中获得最高的出现次数而不是合并

 # weightage option
if args['weightage'] == "yes":
    attr1 = data['decision'].value_counts().idxmax  #highest occurrence in decision
    attr2 = data['decision2'].value_counts().idxmax #highest occurrence in decision2
    heaviest_attribute = data.groupby(['decision','decision2']).size()

理想情况下,我只需要在attr1attr2 之间使用某种max() 函数,但我不知道如何处理。

例如,给定这张表

我想比较决策 1 和决策 2 列,就好像它们是一列一样,在这种情况下,预期的输出将是“是”,因为它是最经常出现的值。

【问题讨论】:

  • 你觉得data.groupby(['decision','decision2']).size().idxmax 吗?
  • 你能添加一些数据样本和预期输出吗?
  • 非常感谢您提供示例输入输出以更好地了解您的问题
  • 感谢您的反馈,我添加了一个示例表作为参考

标签: python pandas multiple-columns


【解决方案1】:

使用DataFrame.meltSeries.mode 并使用Series.iat 按位置选择第一个值:

a = df[['decision','decision 2']].melt()['value'].mode().iat[0]

或通过DataFrame.stack重塑:

a = df[['decision','decision 2']].stack().mode().iat[0]

print (a)
Yes

详情

print (df[['decision','decision 2']].melt()['value'])
0        Yes
1      Maybe
2        Yes
3      Maybe
4        Yes
5         No
6         No
7    Perhaps
8    Perhaps
9     unsure
Name: value, dtype: object
print (df[['decision','decision 2']].stack())
0  decision          Yes
   decision 2         No
1  decision        Maybe
   decision 2         No
2  decision          Yes
   decision 2    Perhaps
3  decision        Maybe
   decision 2    Perhaps
4  decision          Yes
   decision 2     unsure
dtype: object

编辑:

s = df.eq(a).any()

col = s.index[s][0]
print (col)
decision

【讨论】:

  • 谢谢,这就像一个魅力(尤其是a = df[['decision','decision 2']].stack().mode().iat[0])。不过还有一个额外的问题:通过获取这个值,假设每一列都有自己的值,所以在我们的例子中,“是”总是在决策中,而不是在决策 2 中,我们可以使用该值检索列名吗?
  • @AndreRetroPie - 我想我明白了,答案已编辑。
  • 谢谢先生,你是我的英雄
【解决方案2】:

这是一个简单的解决方案。

最好将内容转换为列表并在列表中查找最大出现次数很简单。

import pandas as pd
data = pd.DataFrame({'decision': ['yes', 'maybe', 'yes', 'maybe', 'yes'], 
               'decision 2': ['No', 'No', 'Perhaps', 'Perhaps', 'unsure']
            })
a = list(data['decision'])+list(data['decision 2'])
a = max(set(a), key=a.count)
print(a)

输出:

yes

【讨论】:

  • 返回“yes”,因为max 函数将最后一个字母作为最大值。试试max(['yes','yes','maybe', 'z']),你会发现问题。
  • 是的,你是对的。我现在更新了我的代码。感谢您指出。
【解决方案3】:

可能存在更优雅的解决方案...

df = pd.DataFrame({'decision': ['Yes', 'Maybe', 'Yes', 'Maybe', 'Yes'], 
                   'decision 2': ['No', 'No', 'Perhaps', 'Perhaps', 'unsure']})

d1 = dict(df.groupby('decision').count().loc[:, 'decision 2'])
d2 = dict(df.groupby('decision 2').count().loc[:, 'decision'])

d1.update(d2)

max(d1, key=d1.get)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-17
    • 2015-06-06
    • 2022-11-28
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    相关资源
    最近更新 更多