【问题标题】:dataframe with two conditions on two different columns在两个不同列上有两个条件的数据框
【发布时间】:2020-07-10 02:58:53
【问题描述】:

我想根据两个不同列上的两个条件过滤数据框。在下面的示例中,我想过滤数据框 df 以包含行,使其包含 uids 且 val 列的值计数大于 4 大于 2。

df = pd.DataFrame({'uid':[1,1,1,2,2,3,3,4,4,4],'iid':[11,12,13,12,13,13,14,14,11,12], 'val':[3,4,5,3,5,4,5,4,3,4]})

对于这个数据框,我的输出应该是

 df
   uid  iid  val
0    1   11    3
1    1   12    4
2    1   13    5
5    3   13    4
6    3   14    5
7    4   14    4
8    4   11    3
9    4   12    4

在这里,我过滤掉了uid 2,因为uid == 2val >= 4 的行数小于2。我只想保留uid 的行数,其中val 的值大于4 大于或等于 2。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您需要 groupby.transformsum 一次检查 val 大于或等于 ge 的位置是否大于 4。并检查结果是否为 ge 以将其用作 df 上的布尔过滤器。

    print (df[df['val'].ge(4).groupby(df['uid']).transform(sum).ge(2)])
       uid  iid  val
    0    1   11    3
    1    1   12    4
    2    1   13    5
    5    3   13    4
    6    3   14    5
    7    4   14    4
    8    4   11    3
    9    4   12    4
    

    编辑:避免groupby.transform 的另一种方法是loc val 为ge 的行比4 和列uid,在其上使用value_counts 并在ge 2 处获得True。然后@987654331 @ 回到 uid 列以在 df 上创建布尔过滤器。结果相同,而且可能更快。

    df[df['uid'].map(df.loc[df['val'].ge(4), 'uid'].value_counts().ge(2))]
    

    【讨论】:

      猜你喜欢
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      相关资源
      最近更新 更多