繁体   English   中英

我如何根据多个条件从 DataFrame 中获取 select 行

[英]How do I select rows from a DataFrame based on multi conditions

我有一个 pandas DataFrame 看起来:

df=pd.DataFrame({'user': ['user 1', 'user 4', 'user 1', 'user 4', 'user 1', 'user 4'],
                 'group': [0, 0, 1, 1, 2, 2],
                'x1': [0.9, 0.9, 0.7, 0.7, 0.4, 0.4],
                'x2': [0.759740, 1.106061, 0.619357, 1.260234, 0.540633, 1.437956]})

output:

    user  group  x1    x2
0   user 1  0   0.9 0.759740
1   user 4  0   0.9 1.106061
2   user 1  1   0.7 0.619357
3   user 4  1   0.7 1.260234
4   user 1  2   0.4 0.540633
5   user 4  2   0.4 1.437956

如果 x2 低于 x1,我想返回每个用户的条件,然后返回此行,如果当 x2 低于 x1 时没有满足此条件的行,则返回此用户,并将组号更改为 10。

例如:对于 user1,应选择行号 2,因为它返回的 x2 的最小值低于 x1 1,甚至第 4 行的最小值也是 x2,但 x2 高于 x1。 对于用户 4,所有行的所有 x2 都高于 x1,因此我们将 x2 的最小值的组编号更改为编号 10。

在此处输入图像描述

预期的 output:

在此处输入图像描述

利用:

df2 = (df[df['x2'].lt(df['x1'])]
           .set_index('group')
           .groupby('user')['x2']
           .idxmin()
           .reindex(df['user'].unique(), fill_value=10)
           .reset_index(name='group'))
print (df2)

     user  group
0  user 1      1
1  user 4     10

它是如何工作的:

首先在boolean indexing中按条件过滤行:

print (df[df['x2'].lt(df['x1'])])
     user  group   x1        x2
0  user 1      0  0.9  0.759740
2  user 1      1  0.7  0.619357

然后通过DataFrameGroupBy.idxmin每组最小x2获取组名,因此使用DataFrame.set_index

print (df[df['x2'].lt(df['x1'])].set_index('group'))
         user   x1        x2
group                       
0      user 1  0.9  0.759740
1      user 1  0.7  0.619357

然后通过Series.reindex中的唯一值添加缺失的用户:

print (df[df['x2'].lt(df['x1'])].set_index('group').groupby('user')['x2'].idxmin())
user
user 1     1
Name: x2, dtype: int64

print (df[df['x2'].lt(df['x1'])].set_index('group')
        .groupby('user')['x2'].idxmin()
        .reindex(df['user'].unique(), fill_value=10))
user
user 1     1
user 4    10
Name: x2, dtype: int64

最后通过 Series.reset_index 创建 2 列Series.reset_index

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM