代码之家  ›  专栏  ›  技术社区  ›  Bluefire

不要使用apply()将项映射到任何输出

  •  0
  • Bluefire  · 技术社区  · 8 年前

    假设我有一个 groupby 对象、数据帧或具有 apply() 方法。我希望一些元素不映射到任何输出。例如,在我的情况下,我有一个 子句 我希望那些满足特定标准的群体被忽略。我该怎么做?我试过了 return None 在正在应用的函数中,但是输出仍然有一个组的条目(它为空,但仍然存在)。

    例如,假设数据帧如下所示:

    good_row            272.0  42440.0  29893408.0
    good_row_2          142.0  22360.0  12965953.0
    bad_row             171.0  26920.0  14726556.0
    

    我想跑 df.apply(fn, axis=1) 这样,对于好行,fn返回一些输出,对于坏行,fn告诉apply“忽略”行,而输出没有 bad_row . 在这里,为了便于演示,我使用了一个数据帧而不是groupby,但这是相同的想法。

    2 回复  |  直到 8 年前
        1
  •  1
  •   tobsecret    8 年前

    你可以 return pd.Series(index=['output_column1', 'output_column2', ...]) 而不是 None 然后删除所有行 NaN 价值观如下:

    cleaned_output_df = output_df.drop_na(axis=0, how='all')
    

    或者,如果您事先知道不想将函数应用于哪些行,则可以在使用 apply .

    df.loc[boolean_array].apply(your_function_goes_here)
    

    df.query("column_a > 15").apply(your_function_goes_here)
    

    您还可以使用groupby对象的筛选函数筛选groupby对象,请参见 docs 举个例子。语法如下:

    grouped = df.groupby('column_A')
    filtered = grouped.filter(some_function_that_takes_a_df_and_returns_a_bool)
    
        2
  •  1
  •   bsterrett    8 年前

    先筛选数据帧,然后将函数应用于筛选的结果。

    假设区分好行和坏行的标准是第二列和第三列的比率小于或等于 0.0018 . 也就是说,要将所有单元格(满足条件)中的所有值平方。您可以使用以下代码:

    import pandas as pd
    df = pd.DataFrame(data=[
            {'a': 272., 'b': 42440., 'c': 29893408.},
            {'a': 142., 'b': 22360., 'c': 12965953.},
            {'a': 171., 'b': 26920., 'c': 14726556.}
        ], index=[
            'good_row',
            'good_row_2',
            'bad_row'
        ])
    
    # One line, operator chaining
    df[df['b'] / df['c'] <= 0.0018].apply(pow, args=(2,), axis=1)
    
    # Three lines with intermediate objects
    good_row_index = df['b'] / df['c'] <= 0.0018
    filtered_df = df[good_row_index]
    filtered_df.apply(pow, args=(2,), axis=1)