2017-06-06 126 views
-2

我有一个DataFrame,有3列(A,B,C)和大量的行。在每个列中都有不同类型的元素:A1,A2 ... B1,B2 ...和C1,C2 ...。在熊猫中使用groupby属性

我想查找特定组合(例如(A1,B2,C2))在一行中出现的次数。然后,我想要生成频率计数超过固定阈值的所有组合的(摘要)列表。例如:组合计数(A1,B2,C2)5(A2,B2,C2)7 ....如果固定值为6.

我是熊猫和numpy的新手。这可以使用熊猫高效地完成,如果是的话,怎么样?

+1

您需要添加示例代码和数据。另外,为了清楚起见,只需调用列A,B,C及其值A1,A2,...,B1,B2,...,C1,C2 ...。 – smci

+1

欢迎来到StackOverflow。请花时间阅读这篇文章[如何提供一个伟大的熊猫示例](http://stackoverflow.com/questions/20109391/how-to-make-good-reproducible-pandas-examples)以及如何提供[最小,完整和可验证的示例](http://stackoverflow.com/help/mcve)并相应地修改您的问题。 [如何提出一个好问题](http://stackoverflow.com/help/how-to-ask)上的这些技巧也可能有用。 – jezrael

+0

是的,它可以在熊猫中完成。当你说*“我想找到一个特定的组合(a_i,b_j,c_k)在一行中出现的次数。”*,你想要你的输出是一个表,或什么?向我们展示示例输出。然后,写一个更好的标题,因为*“使用熊猫迭代数据框”*不会告诉我们什么。 – smci

回答

0
df = pd.DataFrame({'A':['A1','A1','A2','A3'], 
        'B':[4,4,6,4], 
        'C':[7,7,9,7]}) 

print (df) 
    A B C 
0 4 7 C1 
1 4 7 C1 
2 6 9 C2 
3 4 7 C3 

对于所有的组合使用数groupby + size

s = df.groupby(["A", "B","C"]).size() 
print (s) 
A B C 
A1 4 7  2 
A2 6 9  1 
A3 4 7  1 
dtype: int64 

对于筛选列表增值boolean indexing

L = s.index[s > 1].tolist() 
print (L) 
[('A1', 4, 7)] 
+0

谢谢。这正是我想要的。 –

+0

如果我的回答很有帮助,请不要忘记[接受](http://meta.stackexchange.com/a/5235/295067)它。谢谢。 – jezrael

+0

如何获取大小值?即当我知道组合说(A1,4,7)时我怎么能找到尺寸。 –

0

只使用熊猫,一个办法可能是使用数据帧.groupby():

counts = dict() 

for group in df.groupby(['It', 'Cc', 'Ct']): 
    print(group) 
    counts[group[0]] = len(group[1]) 

一个更快的方法可能是你的数据帧转换成一个列表,并从集合使用计数器:

from collections import Counter 

listed_df = [tuple(line) for line in list(df.values)] 
counts = Counter(listed_df)