python

时间:2015-08-23 23:46:15

标签: python pandas

我知道如何获得列表列表中最常见的元素,例如

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()不起作用。

2 个答案:

答案 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)。