Pandas在groupby之后出现KeyError错误

3

我想在对数据框进行分组后进行过滤,但是出现了关键字错误。以下是一些示例代码:


df = pd.DataFrame([
                [0, 1, 'm', 5.0], [0, 1, 'm', -7.0],[0, 1, 'm', 9.0],[0, 1, 'm', 32.0],[0, 1, 'm', -11.0],
                [0, 6, 'm', -12.0], [0, 6, 'm', 15.0],[0, 6, 'm', -16.0],[0, 6, 'm', -3.0],[0, 6, 'm', 21.0],
                [0, 12, 'm', 15.0], [0, 12, 'm', 51.0],[0, 12, 'm', 4.0],[0, 12, 'm', 3.0],[0, 12, 'm', 1.0],
                [1, 1, 'm', 5.0], [1, 1, 'm', -7.0],[1, 1, 'm', 9.0],[1, 1, 'm', 32.0],[1, 1, 'm', -11.0],
                [1, 6, 'm', -12.0], [1, 6, 'm', 15.0],[1, 6, 'm', -16.0],[1, 6, 'm', -3.0],[1, 6, 'm', 21.0],
                [1, 12, 'm', 15.0], [1, 12, 'm', 51.0],[1, 12, 'm', 4.0],[1, 12, 'm', 3.0],[1, 12, 'm', 1.0]
                ],
                columns=['id', 'timeperiod', 'timeperiodtype', 'value'])
df['good'] = df['value'].apply(lambda x: 1 if x>0 else 0)
print(df)
print(df[df['timeperiod']>6])

df = df[['id', 'timeperiod','timeperiodtype','good']][df['timeperiod']>0].groupby(['id','timeperiod','timeperiodtype']).mean()

print(df[df['timeperiod']>6])

我希望避免使用reset_index,因为最终的代码中将有几个类似形状的数据框需要聚合/合并/连接。

我相信我一定忽略了什么显而易见的东西。

如何使用列名来过滤分组后的数据框?

谢谢。


你能同时发布完整的错误信息吗? - undefined
你的最后一个打印命令不起作用,因为在.groupby()命令之后,列名为"timeperiod"的列成为了索引。尝试使用print(df)而不是print(df[df['timeperiod']>6]),一切都会正常的。 - undefined
@mosc9575 - print(df) 不会过滤结果。 - undefined
请尝试使用print(df.query('timeperiod > 6')) - undefined
1个回答

4

使用DataFrame.loc按条件和列名进行过滤,然后为了避免MultiIndex,添加DataFrame.reset_index或参数as_index=False

df = df.loc[df['timeperiod']>0, ['id', 'timeperiod','timeperiodtype','good']].groupby(['id','timeperiod','timeperiodtype']).mean().reset_index()

或者:

df = df.loc[df['timeperiod']>0, ['id', 'timeperiod','timeperiodtype','good']].groupby(['id','timeperiod','timeperiodtype'], as_index=False).mean()

print(df)
   id  timeperiod timeperiodtype  good
0   0           1              m   0.6
1   0           6              m   0.4
2   0          12              m   1.0
3   1           1              m   0.6
4   1           6              m   0.4
5   1          12              m   1.0

print(df[df['timeperiod']>6])
   id  timeperiod timeperiodtype  good
2   0          12              m   1.0
5   1          12              m   1.0

编辑:

对于 MultiIndex 中的过滤器可以使用 Index.get_level_values

df = df.loc[df['timeperiod']>0, ['id', 'timeperiod','timeperiodtype','good']].groupby(['id','timeperiod','timeperiodtype']).mean()
print(df)
                              good
id timeperiod timeperiodtype      
0  1          m                0.6
   6          m                0.4
   12         m                1.0
1  1          m                0.6
   6          m                0.4
   12         m                1.0
   
print(df[df.index.get_level_values('timeperiod')>6])
                              good
id timeperiod timeperiodtype      
0  12         m                1.0
1  12         m                1.0

1
我想避免使用reset_index并保持这种格式。我想知道是否可能过滤我的groupby结果的数据框,而不是如何重塑我的数据框。 - undefined
@Giles - 抱歉,我不明白,答案已经被编辑过了。 - undefined
1
我真希望我能给这个答案点赞一千次。因为get_group()已经被弃用,而且不知道为什么其他我尝试的方法都不起作用,我花了好几个小时在追寻如何从一个分组的数据框中选择一行。as_index=False在这里起到了关键作用。非常感谢你。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接