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

时间:2018-07-30 21:25:22

标签: python-3.x pandas dataframe pandas-groupby pandas-apply

假设我有一个groupby对象,一个DataFrame或其他任何带有apply()方法的东西。我希望某些元素不映射到任何输出。例如,对于我来说,我有一个groupby,并且我希望满足某些条件的组被忽略。我怎样才能做到这一点?我在应用的函数中尝试过return None,但是输出中仍然有该组的条目(它为null,但仍然存在)。

例如,假设一个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适用于“忽略”该行,并且输出中没有{{ 1}}。在这里,为了便于演示,我使用了DataFrame而不是groupby,但这是相同的想法。

2 个答案:

答案 0 :(得分: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对象,有关示例,请参见docs。语法如下:

grouped = df.groupby('column_A')
filtered = grouped.filter(some_function_that_takes_a_df_and_returns_a_bool)

答案 1 :(得分:1)

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

让我们说,区分好行和坏行的标准是第二列与第三列的比率小于或等于deposit。假设您要对所有单元格(符合条件)中的所有值求平方。您可以使用以下代码:

asch-cli -H 127.0.0.1 -P 4096 deposit --secret "" --dapp "" --currency "XAS" --amount 5000