Pandas Groupby使用多列选择具有全范围值的行

时间:2015-08-13 17:22:49

标签: python pandas

我正在使用pandas数据帧。从代码:

PendingFileRenameOperations

我有一个带有两个组图层的pandas groupby对象:State和Year。

reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager" /v PendingFileRenameOperations >nul
if errorlevel 1 (
    echo OK
    ....proceed with stuff
) else (
    echo Restart is required
    pause
    exit
)

我只想看看那些年来我有数据的州(即NY和DE,而不是NJ,因为它缺少2010年)。有没有办法抑制那些排名低于满级的嵌套组?

1 个答案:

答案 0 :(得分:2)

StateYear分组并取平均值后

means = contracts.groupby(['State', 'Year'])['$'].mean()

您可以单独使用State进行分组,并使用filter来保留所需的群组:

result = means.groupby(level='State').filter(lambda x: len(x)>=len(years))

例如,

import numpy as np
import pandas as pd
np.random.seed(2015)
N = 15

states = ['NY','NJ','DE']
years = range(2009, 2013)
contracts = pd.DataFrame({
    'State': np.random.choice(states, size=N),
    'Year': np.random.choice(years, size=N), 
    '$': np.random.randint(10, size=N)})

means = contracts.groupby(['State', 'Year'])['$'].mean()
result = means.groupby(level='State').filter(lambda x: len(x)>=len(years))

print(result)

产量

State  Year
DE     2009    8
       2010    5
       2011    3
       2012    6
NY     2009    2
       2010    1
       2011    5
       2012    9
Name: $, dtype: int64

或者,您可以先过滤,然后取平均值:

filtered = contracts.groupby(['State']).filter(lambda x: x['Year'].nunique() >= len(years))
result = filtered.groupby(['State', 'Year'])['$'].mean()

但是玩各种各样的例子表明这通常比取平均值慢,然后过滤。