为了账号安全,请及时绑定邮箱和手机立即绑定

groupby 后的 Pandas Keyerror

groupby 后的 Pandas Keyerror

holdtom 2023-05-16 16:42:33
我想在对它进行分组后过滤数据框,但遇到了一个键错误,这里是一些示例代码: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,因为在最终代码中我将有几个形状相似的数据帧,我将聚合/合并/连接这些数据帧。我确定我一定遗漏了一些明显的东西。如何使用列名来过滤分组数据框?
查看完整描述

1 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

用于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

编辑:


对于过滤器,MuiltiIndex可以使用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


查看完整回答
反对 回复 2023-05-16
  • 1 回答
  • 0 关注
  • 122 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信