下面是一些reproduceable數據:
np.random.seed(0)
df = pd.DataFrame(np.random.randint(0, 10, (10, 2)), columns=list('AB'))
>>> df
A B
0 5 0
1 3 3
2 7 9
3 3 5
4 2 4
5 7 6
6 8 8
7 1 6
8 7 7
9 8 1
樣品過濾器應用程序證明它可以處理數據。
gb = df.groupby('A')
>>> gb.filter(lambda group: group.A.count() >= 3)
A B
2 7 9
5 7 6
8 7 7
這裏有一些選擇:
1)您也可以先過濾器基於該值數,然後組。
vc = df.A.value_counts()
>>> df.loc[df.A.isin(vc[vc >= 2].index)].groupby('A').mean()
B
A
3 4.000000
7 7.333333
8 4.500000
2)執行GROUPBY兩次,前後濾波後:
>>> (df.groupby('A', as_index=False)
.filter(lambda group: group.A.count() >= 2)
.groupby('A')
.mean())
B
A
3 4.000000
7 7.333333
8 4.500000
3)鑑於你的第一個GROUPBY返回羣體,你還可以過濾那些:
d = {k: v
for k, v in df.groupby('A').groups.items()
if len(v) >= 2} # gb.groups.iteritems() for Python 2
>>> d
{3: [1, 3], 7: [2, 5, 8], 8: [6, 9]}
這有點破解,但應該相對高效,因爲您不需要重新組合。
>>> pd.DataFrame({col: [df.ix[d[col], 'B'].mean()] for col in d}).T.rename(columns={0: 'B'})
B
3 4.000000
7 7.333333
8 4.500000
計時與100K行
np.random.seed(0)
df = pd.DataFrame(np.random.randint(0, 10, (100000, 2)), columns=list('AB'))
%timeit df.groupby('A', as_index=False).filter(lambda group: group['A'].count() >= 5).groupby('A').mean()
100 loops, best of 3: 18 ms per loop
%%timeit
vc = df.A.value_counts()
df.loc[df.A.isin(vc[vc >= 2].index)].groupby('A').mean()
100 loops, best of 3: 15.7 ms per loop
但我想要得到每個組的平均值,過濾後。您將獲得整個剩餘數據集的平均值。 – max
我想它會產生錯誤的結果...嘗試另一個數據集,你將有至少兩個不同的值組'A' – MaxU
嗯,我得到不同的結果集與您的_hack_版本... – MaxU