使用pandas方法链接过滤任何一行的行满足每个组中的条件

时间:2018-03-21 02:40:02

标签: python pandas dataframe grouping

为了记录,我已经阅读了以下线索,但似乎没有一个能满足我的需求:

说我有以下表2

sam

我想排除没有创建任何内容的用户,即在is_manually为True和False的两行中created_per_week为0,在这种情况下为用户50.

B

我了解到01-05-30没有3方法,应该使用jon代替。

我得到的最接近的答案是A,但它也将用户33的行手动排除为True,这是不合需要的。我也尝试了01-01-19,但它返回了一个KeyError。

换句话说,我正在搜索R中select name, sum(case when uniques.choice = A then 1 else 0 end) votesA, sum(case when uniques.choice = B then 1 else 0 end) votesB FROM ( SELECT id, name, choice, max(date) FROM votes GROUP BY name ) uniques; 的等价感谢。

2 个答案:

答案 0 :(得分:1)

transform + any

df[df.assign(New=df.created_per_week==0).groupby('user_id').created_per_week.transform('any')]
Out[425]: 
   user_id  is_manually  created_per_week
0       10         True                59
1       10        False                90
2       33         True                 0
3       33        False                64

或者只是使用loc + isin

df.loc[df.user_id.isin(df[df.created_per_week!=0].user_id)]
Out[426]: 
   user_id  is_manually  created_per_week
0       10         True                59
1       10        False                90
2       33         True                 0
3       33        False                64

来自PiR

f, u = pd.factorize(df.user_id); df[np.bincount(f, df.created_per_week)[f] > 0]

答案 1 :(得分:0)

您可以应用groupby然后filter命令来获取输出。

df.groupby('user_id').filter(lambda x: (x['created_per_week'] != 0).any())

    user_id is_manually created_per_week
0       10        True                59
1       10       False                90
2       33        True                 0
3       33       False                64