我有一个数据框df = pd.DataFrame({'id': [1, 1, 1, 1, 1, 2, 2, 2, 2, 2], 'value2': [30, 28, 27, 24, 25, 29, 28, 28, 26, 25], 'value3': [29, 29, 27, 25, 24, 27, 27, 26, 26, 26], 'value4': [30, 29, 25, 25, 25, 29, 28, 28, 25, 26]})
| 身份证|价值观2|价值观3|价值观4|
| --------------|--------------|--------------|--------------|
| 1|三十|二十九|三十|
| 1|二十八|二十九|二十九|
| 1|二十七|二十七|二十五|
| 1|二十四|二十五|二十五|
| 1|二十五|二十四|二十五|
| 二|二十九|二十七|二十九|
| 二|二十八|二十七|二十八|
| 二|二十八|二十六|二十八|
| 二|二十六|二十六|二十五|
| 二|二十五|二十六|二十六|
并且我需要选择每个id
中的所有行,直到列value2
,value3
和value4
满足条件。条件如下:选择每个组中的所有行(id
),直到任何列(value2
,value3
或value4
)中的值小于或等于25。所以我的最终表应该是这样的:
| 身份证|价值观2|价值观3|价值观4|
| --------------|--------------|--------------|--------------|
| 1|三十|二十九|三十|
| 1|二十八|二十九|二十九|
| 1|二十七|二十七|二十五|
| 二|二十九|二十七|二十九|
| 二|二十八|二十七|二十八|
| 二|二十八|二十六|二十八|
| 二|二十六|二十六|二十五|
我试过df[df['value2'].eq(25).cummin() | df['value3'].eq(25).cummin() | df['value4'].eq(25).cummin()]
,但它是严格的25,而不是小于或等于25,并只适用于整个datafame(而不是每个id
)。什么是最好的方式来过滤datafame根据我的条件?
6条答案
按热度按时间vsmadaxz1#
您可以将自定义
groupby.apply
与cummax
、any
和shift
一起使用:输出:
kulphzqa2#
等价于
value2 > 25 and value3 > 25 and value4 >= 25
,所以一个非常快速的布尔掩码解决方案:v440hwme3#
不知道这是否是最短的方法,但根据您的各种条件,认为这将为您提供所需的......
df
是您现有的 Dataframe ,df1
将是您过滤的 Dataframe 。w6lpcovy4#
另一种方法是使用
idxmin
,idxmax
:5w9g7ksd5#
我将创建一个临时列来存储值1,如果跨行的值〈= 25。然后我将使用cumsum函数:
lyr7nygr6#
下面是使用
.transform('idxmax')
的方法输出: