查找多列中最常见的行

时间:2018-01-04 01:40:41

标签: python python-2.7

我有一个带有标识列(Name)和三个值列(A,B,C)的pandas数据帧。

df = pd.DataFrame({'Name': ['John', 'John', 'John', 'John', 'John', 'Sam', 'Sam', 'Sam'], 'A': [1, 1, 1, 2, 2, 3, 3, 3], 'B': [1, 1, 2, 2, 2, 3, 4, 3], 'C': [2, 1, 1, 1, 1, 3, 3, 3]})

对于每个名称,我想在3个值列中找到最常见的值组合。

结果应为:

['John', 2, 2, 1] # as the combination 2, 2, 1 appears twice
['Sam', 3, 3, 3] # as the combination 3, 3, 3 appears twice

第一次询问有关堆栈溢出的问题 - >任何有关如何改进问题的建议都是值得欢迎的。

提前致谢。

1 个答案:

答案 0 :(得分:0)

该方法基于@noslenkwah和@skrubber的评论。

如果您需要为每个名称提供最常见的行

df = pd.DataFrame({'Name': ['John', 'John', 'John', 'John', 'John', 'Sam', 'Sam', 'Sam', 'Sam'] , 'A': [1, 1, 1, 2, 2, 3, 3, 3, 3] , 
                'B': [1, 1, 2, 2, 2, 3, 4, 3, 3] , 'C': [2, 1, 1, 1, 1, 3, 3, 3, 3]})
df_count = df.groupby(["A", "B", "C"])['Name'].value_counts().reset_index(name="Count")
l = list()
for name in set(df_count.Name):
    freq = df_count[df_count.Name == name].Count.max()
    l.append(df_count[(df_count.Name == name) & (df_count.Count == freq)].values.tolist()[0])
print(l)
[[3, 3, 3, 'Sam', 3], [2, 2, 1, 'John', 2]]

首先是df方法组["A", "B", "C"]。然后遍历名称,首先计算此名称中最常见的行的频率。然后在查询df_count[(df_count.Name == name) & (df_count.Count == freq)]中筛选出具有不同频率和不同名称的组。

更普遍的问题:找到频率最高的行,无论名称如何,都可以尝试

df_count = df.groupby(["A", "B", "C"])['Name'].value_counts().reset_index(name="Count")
max_freq = df_count["Count"].max()
df_count[df_count["Count"] == max_freq]

    A   B   C   Name    Count
3   2   2   1   John    2
4   3   3   3   Sam     2

参考

Pandas: Selecting rows based on value counts of a particular column

Selecting with complex criteria from pandas.DataFrame