【问题标题】:Filtering a pandas df with any of the list values [duplicate]使用任何列表值过滤熊猫 df [重复]
【发布时间】:2021-11-02 22:06:58
【问题描述】:

我有一个熊猫数据框:

df
0       PL
1       PL
2       PL
3       IT
4       IT
        ..
4670    DE
4671    NO
4672    MT
4673    FI
4674    XX
Name: country_code, Length: 4675, dtype: object

我正在通过德国国家标签“DE”过滤此内容:

df = df[df.apply(lambda x: 'DE' in x)]

如果我想过滤更多国家/地区而不是手动添加它们:.apply(lambda x: 'DE' in x or 'GB' in x)。但是我想创建一个国家列表并自动生成此语句。

类似这样的:

countries = ['DE', 'GB', 'IT']
df = df[df.apply(lambda x: any_item_in_countries_list in x)]

我想我可以过滤 df 3 次,然后通过 concat() 将这些片段合并回来,但是是否有更通用的函数来实现这一点?

【问题讨论】:

    标签: python pandas filter lambda


    【解决方案1】:

    你可以使用.isin():

    df[df['country_code'].isin(['DE', 'GB', 'IT'])]
    

    性能对比:

    import timeit
    import pandas as pd
    df = pd.DataFrame({'country_code': ['DE', 'GB', 'IT', 'MT', 'FI', 'XX'] * 1000})
    
    %timeit df[df['country_code'].isin(['DE', 'GB', 'IT'])]
    409 µs ± 19 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    
    %timeit df['country_code'].apply(lambda x: x in ['DE', 'AT', 'GB'])
    1.35 ms ± 474 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    【讨论】:

    • .apply(lambda x: x in ['DE', 'AT', 'GB']),也可以做个基准测试吗?
    • @oakca,apply被认为是瓶颈操作,我可以做一个比较,但我认为apply无法击败pandas的许多标准方法。
    • 我会接受,但出于文档原因,如果你做一个简单的基准测试并在你的答案中展示它会很好。
    • @oakca 添加了性能检查。
    【解决方案2】:

    如果你有列名,你可以试试这个

    countries = ['DE', 'GB', 'IT']
    df[df['country_code'].isin(countries)]
    

    【讨论】:

    • 他展示了一个pd.Series,您可以在他的示例底部看到该系列的名称(或列名)。
    • .apply(lambda x: x in ['DE', 'AT', 'GB']),也可以做个基准测试吗?
    • Oakca,您可以使用 colab 和 py 在过滤器行上调用 %timeit 来做到这一点
    猜你喜欢
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    相关资源
    最近更新 更多