如何自动按列过滤行
问题描述:
我有熊猫数据框如下:如何自动按列过滤行
df =
COL_1 COL_2 VAL_1
ABC AAA ABC
CDE CDE RTY
ABC ABC RTY
ABC RTY DEF
我想caculate含有从开始COL
列的任意唯一值的行数:COL_1
和COL_2
VAL_1
(不应该用过的)。
预期的结果是:
GROUP COUNT
ABC 3
CDE 2
RTY 1
AAA 1
一种可能性是手动指定列名和计算的行也手动指定用于GROUP
所有可能的值的数目。但是,如果GROUP
中的列数和值很大,那么显然这个解决方案并不好。
如何自动执行此操作?我认为这种方法应该是过滤所有具有以COL
开头的列的tunique值的行吗?
我试过这个,但是它在1Gb的数据集上花费很长时间,并且给出了一些不正确的结果。我也不知道如何避免指定GROUP
:str.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
答
这是你想要的吗?
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
是的,这个解决方案是更好! :) – MaxU
这是一个不错的解决方案。顺便说一下,你知道如何给这段代码添加条件吗?我的意思是如果我需要对行进行计数,同时考虑到“VAL_1”列的值等于“ABC”? – Dinosaurius
如果您要计算您拥有的行数,则可以使用'shape [0]',并使用逻辑索引来选择具有条件的行。根据你的需要,语法可以是'df [df.VAL_1 ==“ABC”]。filter(regex =“^ COL”)。shape [0]'。 – Psidom