我有一个带有标识列(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
第一次询问有关堆栈溢出的问题 - >任何有关如何改进问题的建议都是值得欢迎的。
提前致谢。
答案 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