我想根据行中的不同值通过更复杂的函数过滤 Dataframe 。
有没有可能像在ES6 filter function中那样通过布尔函数过滤DF行?
极端简化的例子来说明这个问题:
import pandas as pd
def filter_fn(row):
if row['Name'] == 'Alisa' and row['Age'] > 24:
return False
return row
d = {
'Name': ['Alisa', 'Bobby', 'jodha', 'jack', 'raghu', 'Cathrine',
'Alisa', 'Bobby', 'kumar', 'Alisa', 'Alex', 'Cathrine'],
'Age': [26, 24, 23, 22, 23, 24, 26, 24, 22, 23, 24, 24],
'Score': [85, 63, 55, 74, 31, 77, 85, 63, 42, 62, 89, 77]}
df = pd.DataFrame(d, columns=['Name', 'Age', 'Score'])
df = df.apply(filter_fn, axis=1, broadcast=True)
我发现了一些使用apply()
的东西,但这实际上只使用bool函数返回False
/True
填充的行,这是预期的。
我的解决方法是当函数结果为True时返回行本身,否则返回False。但这之后需要额外的过滤。
Name Age Score
0 False False False
1 Bobby 24 63
2 jodha 23 55
3 jack 22 74
4 raghu 23 31
5 Cathrine 24 77
6 False False False
7 Bobby 24 63
8 kumar 22 42
9 Alisa 23 62
10 Alex 24 89
11 Cathrine 24 77
2条答案
按热度按时间fjaof16o1#
我认为在这里使用函数是不必要的。使用布尔索引更好,而且主要是更快:
对于更复杂的过滤,你可以使用一个必须返回布尔值的函数:
xyhw6mcr2#
一个非常可读的过滤 Dataframe 的方法是
query
。另一种方法是将复杂的函数传递给
loc
进行过滤。