pandas 如何基于多个条件从DataFrame中选择行

qacovj5a  于 2023-01-07  发布在  其他
关注(0)|答案(1)|浏览(134)

我有一个PandasDataFrame看起来:

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]})

输出:

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。
例如:对于用户1,应该选择行号2,因为它返回的最小值为x2,低于x11,甚至行4的最小值为x2,但x2高于x1。对于用户4,所有行的所有x2都高于x1,因此我们将最小值为x2的组号更改为编号10。

预期产出:

plicqrtu

plicqrtu1#

use:

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列DataFrame。

相关问题