我知道如何获得列表列表中最常见的元素,例如
a = [[3,4], [3,4],[3,4], [1,2], [1,2], [1,1],[1,3],[2,2],[3,2]]
print max(a, key=a.count)
应该打印[3, 4]
,即使第一个元素的最常见数字是1
,第二个元素的数字是2
。
我的问题是如何使用Pandas.DataFrame做同样的事情。
例如,我想知道以下方法的实现get_max_freq_elem_of_df
:
def get_max_freq_elem_of_df(df):
# do some things
return freq_list
df = pd.DataFrame([[3,4], [3,4],[3,4], [1,2], [1,2], [1,1],[1,3],[2,2],[4,2]])
x = get_max_freq_elem_of_df(df)
print x # => should print [3,4]
请注意,DataFrame.mode()方法不起作用。对于上面的示例,df.mode()
返回[1, 2]
而不是[3,4]
解释了为什么DataFrame.mode()不起作用。
答案 0 :(得分:3)
您可以使用groupby.size
,然后找到max:
>>> df.groupby([0,1]).size()
0 1
1 1 1
2 2
3 1
2 2 1
3 4 3
4 2 1
dtype: int64
>>> df.groupby([0,1]).size().idxmax()
(3, 4)
答案 1 :(得分:2)
在python中你使用Counter *:
In [11]: from collections import Counter
In [12]: c = Counter(df.itertuples(index=False))
In [13]: c
Out[13]: Counter({(3, 4): 3, (1, 2): 2, (1, 3): 1, (2, 2): 1, (4, 2): 1, (1, 1): 1})
In [14]: c.most_common(1) # get the top 1 most common items
Out[14]: [((3, 4), 3)]
In [15]: c.most_common(1)[0][0] # get the item (rather than the (item, count) tuple)
Out[15]: (3, 4)
*请注意您的解决方案
max(a, key=a.count)
(尽管它有效)是O(N ^ 2),因为在每次迭代时它需要遍历a
(以获得计数),而Counter是O(N)。