数据框中值对的出现次数
Posted
技术标签:
【中文标题】数据框中值对的出现次数【英文标题】:Number of occurrence of pair of value in dataframe 【发布时间】:2018-10-22 22:16:00 【问题描述】:我有以下列的数据框:
Name, Surname, dateOfBirth, city, country
我很想知道什么是最常见的名字和姓氏组合以及它出现的次数。 也很高兴看到前 10 种组合的列表。
我对第一名的想法是:
mostFreqComb= df.groupby(['Name','Surname'])['Name'].count().argmax()
但我认为它没有给我正确的答案。 非常感谢您的帮助!
谢谢, 奈布
【问题讨论】:
性能说明,包括替代方案:Pandas groupby.size vs series.value_counts vs collections.Counter with multiple series 【参考方案1】:有关以下解决方案的性能影响,请参阅Pandas groupby.size vs series.value_counts vs collections.Counter with multiple series。它们在下面以最佳性能优先显示。
GroupBy.size
您可以使用 GroupBy.size
使用 (Name, Surname) 元组索引创建一系列计数:
res = df.groupby(['Name', 'Surname']).size().sort_values(ascending=False)
通过对这些值进行排序,我们可以轻松提取出最常见的:
most_common = res.head(1)
most_common_dups = res[res == res.iloc[0]].index.tolist() # handles duplicate top counts
value_counts
另一种方法是构造一系列元组,然后申请pd.Series.value_counts
:
res = pd.Series(list(zip(df.Name, df.Surname))).value_counts()
结果将是一系列按姓名-姓氏组合索引的计数,从最常见到最少排序。
name, surname = res.index[0] # return most common
most_common_dups = res[res == res.max()].index.tolist()
collections.Counter
如果您希望创建包含(name, surname): counts
条目的字典,可以通过collections.Counter
进行:
from collections import Counter
zipper = zip(df.Name, df.Surname)
c = Counter(zipper)
Counter
具有有用的方法,例如 most_common
,您可以使用它们来提取结果。
【讨论】:
嗯,好像你在那儿忍者编辑了我。好吧,我建议将 Counter 放在顶部,这是迄今为止您答案中最好的部分。 @cᴏʟᴅsᴘᴇᴇᴅ,我不同意..所有的意见问题:)。例如,与pandas
系列索引相比,从Counter
获取重复最高计数的语法很麻烦[理解]。如果性能不是问题,我推荐value_counts
我不确定我是否遵循。似乎 OP 只想要这里最常见的 10 个值。为什么有重复计数很重要?顺便说一句,我会注意到您目前没有任何选项可以满足 OP 的要求。
@cᴏʟᴅsᴘᴇᴇᴅ,如果重复第 10 次计数怎么办?那么第 10 个最受欢迎的计数是 100,并且有 3 个姓氏组合与 100 计数?带有系列索引的nlargest
在语法上比理解更清晰。 Look here 恕我直言丑陋的替代品Counter
。
我明白你所说的可能对某些用户很重要,但我怀疑这是否是这个 OP 中“我想要前 10 名”的意义所在。真的,我明白你的意思,Counter 真的应该有不止一个功能,让我们与他们的 API 进行更清洁的交互。【参考方案2】:
对于高性能 Counter
来说似乎是一个很好的用例:
from collections import Counter
popular_names = Counter(zip(df.Name, df.Surname)).most_common(10)
【讨论】:
以上是关于数据框中值对的出现次数的主要内容,如果未能解决你的问题,请参考以下文章