组唯一的Groupby过滤器

时间:2018-08-02 19:18:51

标签: python pandas pandas-groupby

在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,但是期望为标量   布尔”

完全开放了完成相同复杂过滤任务的替代方法!

3 个答案:

答案 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