我要在对数据框进行分组后过滤,但是遇到键盘错误,这是一些示例代码:
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,因为在最终代码中,我将有几个形状相似的数据框,它们将被聚合/合并/串联。
我确定我一定会遗漏一些明显的东西。
如何使用列名来过滤分组的数据框?
谢谢。
答案 0 :(得分:1)
使用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