Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有多列的Pandas Groupby选择具有全范围值的行_Python_Pandas - Fatal编程技术网

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

Python 具有多列的Pandas Groupby选择具有全范围值的行,python,pandas,Python,Pandas,我正在使用熊猫数据帧。从代码中: contracts.groupby(['State','Year'])['$'].mean() 我有一个pandas groupby对象,它有两个组层:State和Year State / Year / $ NY 2009 5 2010 10 2011 5 2012 15 NJ 2009 2 2012 12 DE 2009 1 2010

我正在使用熊猫数据帧。从代码中:

contracts.groupby(['State','Year'])['$'].mean()
我有一个pandas groupby对象,它有两个组层:State和Year

State / Year / $
NY     2009   5
       2010   10
       2011   5
       2012   15
NJ     2009   2
       2012   12
DE     2009   1
       2010   2
       2011   3
       2012   6

我只想看看那些我拥有所有年份数据的州(即纽约州和德州,而不是新泽西州,因为它缺少2010年的数据)。有没有办法抑制那些低于满秩的嵌套组?

在按
状态
年份
分组并取平均值后

means = contracts.groupby(['State', 'Year'])['$'].mean()
您可以单独按
状态
分组,并使用
过滤器
保留所需的组:

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()
但是使用各种例子表明,这通常比取平均值然后过滤要慢