【问题标题】:How to Boolean index a pandas dataframe with a function如何使用函数对熊猫数据框进行布尔索引
【发布时间】:2020-10-06 14:32:17
【问题描述】:

有没有办法在 pandas DataFrame 中使用布尔索引方法?

例如:

import pandas


def filter_func(v) -> bool:
    return v == 'asd'


def main():
    df_test = pandas.DataFrame(
        [
            ['sd'], ['asd'], ['sdf']
        ],
        columns=["col-a"]
    )
    #### ERROR: This next line calls filter_func with all contents of column 'col-a'
    result = df_test[df_test['col-a'] == filter_func(df_test['col-a'])]


if __name__ == '__main__':
    main()

在上面的示例中,我只想保留那些filter_func 将返回True 的值。 result 应该包含单行数据框,但我得到的是空数据框。

我了解不是为每一行执行filter_func,而是只执行一次。

有没有办法为每一行调用它?

在这种情况下,我应该将applymap 用于Series 吗?

或者还有其他方法吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:
    • df_test['col-a'] 正在被函数过滤,因此只需要 [filter_func(df_test['col-a'])],而不需要 [df_test['col-a'] == filter_func(df_test['col-a'])]
    • pandas: Boolean Indexing
    import pandas as pd
    import numpy as np
    import random
    
    # sample data
    np.random.seed(365)
    random.seed(365)
    rows = 1100
    data = {'a': np.random.randint(10, size=(rows)),
            'groups': [random.choice(['1-5', '6-25', '26-100', '100-500', '500-1000', '>1000']) for _ in range(rows)],
            'treatment': [random.choice(['Yes', 'No']) for _ in range(rows)],
            'date': pd.bdate_range(datetime.today(), freq='h', periods=rows).tolist()}
    df = pd.DataFrame(data)
    
       a  groups treatment                date
    0  2   >1000       Yes 2020-10-06 00:00:00
    1  4  26-100        No 2020-10-06 01:00:00
    2  1   >1000       Yes 2020-10-06 02:00:00
    3  5    6-25       Yes 2020-10-06 03:00:00
    4  2  26-100        No 2020-10-06 04:00:00
    
    # filter function
    def filter_func(v) -> bool:
        return v == '26-100'
    
    
    # call function
    filtered = df[filter_func(df.groups)]
    
    # display(filtered)
        a  groups treatment                date
    1   4  26-100        No 2020-10-06 01:00:00
    4   2  26-100        No 2020-10-06 04:00:00
    21  2  26-100       Yes 2020-10-06 21:00:00
    24  9  26-100       Yes 2020-10-07 00:00:00
    32  5  26-100        No 2020-10-07 08:00:00
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-19
      • 2021-04-06
      • 2014-10-11
      • 2021-11-02
      • 1970-01-01
      • 2018-02-07
      • 2016-07-20
      • 1970-01-01
      相关资源
      最近更新 更多