Pandas 按功能过滤数据帧行

Posted

技术标签:

【中文标题】Pandas 按功能过滤数据帧行【英文标题】:Pandas filter data frame rows by function 【发布时间】:2019-01-06 10:40:30 【问题描述】:

我想根据行中的不同值通过更复杂的函数过滤数据框。

是否有可能通过布尔函数过滤 DF 行,就像你可以做到的那样,例如在ES6 filter function?

极端简化的例子来说明问题:

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)

print(df)

我使用 apply() 位发现了一些东西,这实际上只返回 False/True 使用 bool 函数填充的行,这是预期的。

我的解决方法是在函数结果为 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

【问题讨论】:

【参考方案1】:

我认为在这里使用函数是不必要的。使用boolean indexing更好,主要更快:

m = (df['Name'] == 'Alisa') & (df['Age'] > 24)
print(m)
0      True
1     False
2     False
3     False
4     False
5     False
6      True
7     False
8     False
9     False
10    False
11    False
dtype: bool

#invert mask by ~
df1 = df[~m]

对于更复杂的过滤,您可以使用必须返回布尔值的函数:

def filter_fn(row):
    if row['Name'] == 'Alisa' and row['Age'] > 24:
        return False
    else:
        return True

df = pd.DataFrame(d, columns=['Name', 'Age', 'Score'])
m = df.apply(filter_fn, axis=1)
print(m)
0     False
1      True
2      True
3      True
4      True
5      True
6     False
7      True
8      True
9      True
10     True
11     True
dtype: bool

df1 = df[m]

【讨论】:

以上是关于Pandas 按功能过滤数据帧行的主要内容,如果未能解决你的问题,请参考以下文章

按包含 str 过滤熊猫数据帧行

通过匹配连续列中的值过滤 R 数据帧行

Pandas:按类别过滤数据框

Python pandas根据日期范围按升序过滤数据

创建一个按日期月份过滤的下拉列表(pandas + plotly)

Pandas Pivot Table:按条件过滤时出错