我有一个函数
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)
如果您提供一个更详细的示例,说明数据的外观以及所需的输出应该是什么样子,那么可能会有更快的方法。