2017-03-29 13 views
2

私は、次のパンダは、例えば、特定の列に私の各値のカウントを与える機能value_counts()を使用して、今すぐpandasデータフレームをvalue_countsにサブセット化する方法は?

import pandas as pd 
df = pd.read_csv("filename1.csv") 

df 
    column1 column2 column3 
0  10  A   1 
1  15  A   1 
2  19  B   1 
3  5071  B   0 
4  5891  B   0 
    B   0 
6  12  B   2 
7  13  C   2 
8  20  C   0 
9   5  C   3 
10  9  C   3 

をDATAFRAMEています

df.column3.value_counts() 

1 3 
2 2 
3 2 

ただし、特定の列の値の数に基づいてpandasデータフレームをサブセット化したいと考えています。たとえば、上記のデータフレームdfでは、3つ以上の一意の値(0を除く)を持つ行をサブセット化したいと考えています。この場合、値が2と3の行は、2行のみ、すなわち2を持っていたように得られたデータフレームが

df 
    column1 column2 column3 
0  10  A   1 
1  15  A   1 
2  19  B   1 

なり、3のみcolumn3で二回発生しました。これを行うためのパンダの方法は何ですか?

答えて

3

groupby.filterを使用できます。フィルタでは、データフレームをフィルタリングするために、各グループに一意のブール値を作成:

df.groupby("column3").filter(lambda g: (g.name != 0) and (g.column3.size >= 3)) 

enter image description here

別のオプションは、次のようになります。

df[(df.column3 != 0) & (df.groupby("column3").column3.transform("size") >= 3)] 
+0

「g.name」はなぜですか? – ShanZhengYang

+0

グループのキーです。つまり、この場合は 'column3'の一意な値です。 'g.column3.iat [0]'を使うこともできます。私はちょうどそれが短いことを見つける。 – Psidom

1

それとも、前にゼロを除外することができあなたのグループ:

df1[df1['column3'] != 0].groupby("column3").filter(lambda x: x['column3'].size >= 3) 
1

代替ソリューション:

In [132]: cnt = df.column3.value_counts() 

In [133]: cnt 
Out[133]: 
0 4 
1 3 
3 2 
2 2 
Name: column3, dtype: int64 

In [134]: v = cnt[(cnt.index != 0) & (cnt >= 3)].index.values 

In [135]: v 
Out[135]: array([1], dtype=int64) 

In [136]: df.query("column3 in @v") 
Out[136]: 
    column1 column2 column3 
0  10  A  1 
1  15  A  1 
2  19  B  1 
関連する問題