如何自动按列过滤行

问题描述:

我有熊猫数据框如下:如何自动按列过滤行

df = 

COL_1 COL_2 VAL_1 
ABC  AAA  ABC 
CDE  CDE  RTY 
ABC  ABC  RTY 
ABC  RTY  DEF 

我想caculate含有从开始COL列的任意唯一值的行数:COL_1COL_2VAL_1(不应该用过的)。

预期的结果是:

GROUP COUNT 
ABC  3 
CDE  2 
RTY  1 
AAA  1 

一种可能性是手动指定列名和计算的行也手动指定用于GROUP所有可能的值的数目。但是,如果GROUP中的列数和值很大,那么显然这个解决方案并不好。

如何自动执行此操作?我认为这种方法应该是过滤所有具有以COL开头的列的tunique值的行吗?

我试过这个,但是它在1Gb的数据集上花费很长时间,并且给出了一些不正确的结果。我也不知道如何避免指定GROUPstr.contains('ABC')的值。

t_cols = [c for c in df.columns.values if not c.startswith('COL')] 
aa = df.drop(t_cols,axis=1) 
aa.apply(lambda row: row.astype(str).str.contains('ABC').any(), axis=1).shape 

或者你可以使用value_counts()

df.filter(regex = "^COL").stack().value_counts() 

#ABC 4 
#CDE 2 
#AAA 1 
#RTY 1 
#dtype: int64 
+1

是的,这个解决方案是更好! :) – MaxU

+0

这是一个不错的解决方案。顺便说一下,你知道如何给这段代码添加条件吗?我的意思是如果我需要对行进行计数,同时考虑到“VAL_1”列的值等于“ABC”? – Dinosaurius

+0

如果您要计算您拥有的行数,则可以使用'shape [0]',并使用逻辑索引来选择具有条件的行。根据你的需要,语法可以是'df [df.VAL_1 ==“ABC”]。filter(regex =“^ COL”)。shape [0]'。 – Psidom

这是你想要的吗?

In [12]: df.filter(like='COL_').stack().to_frame('COL').groupby('COL').size() 
Out[12]: 
COL 
AAA 1 
ABC 4 
CDE 2 
RTY 1 
dtype: int64