2017-03-29 139 views
2

我有以下的大熊貓據幀如何在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 

現在,使用功能value_counts()會給我中某列的每個值的計數,例如

df.column3.value_counts() 

1 3 
2 2 
3 2 

但是,我想根據給定列中的值的數量子集一個熊貓數據框。例如,在上面的數據框df中,我想對具有3個或更多個唯一值(不包括0)的行進行子集分析。在這種情況下,所產生的數據幀將是

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

作爲行爲值2和3僅具有兩行,即,2,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 
相關問題