2016-12-24 10 views
2

次のように私はパンダのデータフレームを持っていますすべきではないCOL_1COL_2を(VAL_1列によって行をフィルタリング自動化する方法

df = 

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

は私がCOLで始まる列から任意の一意の値を含む行の数をcaculateしたいです中古)。

期待される結果である:

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 

答えて

5

それとも、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

2

これは必要なものですか?

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 
関連する問題