如何在不使用for循环的情况下将函数应用于每个pandas groupby对象的迭代行?(或比for循环更快的方法)



我有一个函数

def net_sale(df):
if df['target'] == -1:
return float(df['quantity1'] + df['quantity2'])

一种groupby对象

g = df.sort_values(['date'], ascending=True).groupby('groups-concatenated-string')

我想在不使用for循环的情况下将变换"net_sale"应用于g中的每个组。

以下代码是我的解决方案:它在较小的数据集(50行(上工作,但在800k行以上的数据帧上运行需要无限长的时间(est年(。

for name, group in g:
df['result_column'] = df.apply(net_sale, axis=1)

我正在寻找一种运行此函数的方法";net_ sale";对行进行单独分组,而不必使用for循环来遍历行。

示例数据帧:

group   date    target   quant1   quant2   result_column
0    1      2018      0       10        NaN.      NaN
1    1      2018     -1        2        -2        0
2    2      2019     -1        3        -3        0
3    2      2019     -1        3        -1        2
4    2      2019      0       10        -1        9

您当前的方法为循环中的每一行调用apply方法,因此运行时间可能至少是行数的二次方,因为每次调用apply都会在整个DataFrame上迭代。你可以试试这样的东西:

def net_sale(row):
if row['target'] == -1:
return float(row['quantity1'] + row['quantity2'])
# do you want to return null if row['target'] != -1? otherwise you should define an else case
df["result_column"] = df.apply(net_sale, axis=1)

如果您提供一个更详细的示例,说明数据的外观以及所需的输出应该是什么样子,那么可能会有更快的方法。

最新更新