0

假设我有一个groupby对象、一个 DataFrame 或其他任何带有apply()方法的东西。我希望某些元素不映射到任何输出。例如,在我的情况下,我有一个groupby并且我希望忽略满足特定标准的组。我怎样才能做到这一点?我已经尝试过return None正在应用的函数,但输出仍然有一个组条目(它是空的,但它仍然存在)。

例如,假设 DataFrame 如下所示:

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. 在这里,为了便于演示,我使用了 DataFrame 而不是 groupby,但这是相同的想法。

4

2 回答 2

1

您可以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 对象,请参阅 文档以获取示例。语法如下所示:

grouped = df.groupby('column_A')
filtered = grouped.filter(some_function_that_takes_a_df_and_returns_a_bool)
于 2018-07-30T22:48:33.020 回答
1

首先过滤您的数据框,然后将您的函数应用于过滤后的结果。

假设区分好行与坏行的标准是第二列与第三列的比率小于或等于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)
于 2018-07-30T23:05:26.737 回答