在groupby中执行过滤器并遇到麻烦。筛选器用于groupby的每个数据帧中的元素;对于groupby的数据框是唯一的。
我想对ID上的第一个df进行分组,然后返回在conditions_df中显示的条件下为值过滤的df。该条件与第一个分组依据具有相同的值。
df = pd.DataFrame({'ID':[1,1,2,2,3,3],
'V': [0,1,1,0,1,1]})
condition_df = pd.DataFrame(index = [1,2,3], data= {'Condition': [0,1,1]})
我希望看到返回的数据框:
df = pd.DataFrame({'ID':[1,2,3,3],
'V': [0,1,1,1]})
这似乎不起作用。
df.groupby(['ID']).filter(lambda x: x['V'] == condition_df.loc[x.index, ['Condition']])
即使没有条件查找也无法进行简化。
df.groupby(['ID']).filter(lambda x: x['V'] == 0)
两个都返回
“ TypeError:过滤器函数返回了一个Series,但是期望为标量 布尔”
完全开放了完成相同复杂过滤任务的替代方法!
答案 0 :(得分:0)
加入您的条件,然后过滤:
df = df.join(condition_df, on="ID")
df[df["V"] == df["Condition"]]
结果:
ID V Condition
0 1 0 0
2 2 1 1
4 3 1 1
5 3 1 1
答案 1 :(得分:0)
merge
df.merge(condition_df.reset_index().rename(columns={'index':'ID','Condition':'V'}),how='inner')
Out[831]:
ID V
0 1 0
1 2 1
2 3 1
3 3 1
答案 2 :(得分:0)
您需要:
df.merge(condition_df.reset_index(), left_on=['ID', 'V'], right_on=['index', 'Condition']).drop(['index', 'Condition'], 1)
输出:
ID V
0 1 0
1 2 1
2 3 1
3 3 1