【发布时间】:2021-02-22 10:21:31
【问题描述】:
我有大约 5000 万行数据和 400 万个唯一 ID。对于这些 ID 中的每一个,我想计算支付的净金额(而不是累积的,由“支付”表示)。 原始数据框如下所示: Original dataframe
这是我想要的结果: Resultant dataframe
通过通常的 for 循环方法执行此操作非常慢,我希望加快此过程,但主要问题是需要一次为每个唯一 ID 执行此操作(以免产生差异)。因此,我不能为此使用.apply()。
这是我现在的代码:
df_super = pd.DataFrame()
for idx, df_sub in df.groupby("ID"):
df_sub.loc[:,'net_paid_amount'] = df_sub['paid'] - df_sub['paid'].shift(1) # Getting difference b/w last amount and current amount
df_sub['net_paid_amount'].fillna(df_sub['paid'].iloc[0], inplace=True) # Filling first value which appears as "NaN"
df_super = df_super.append(df_sub)
有没有什么方法可以代替 for 循环来做到这一点?
【问题讨论】:
-
嗨,如果您不需要
for循环,您可以简单地使用df['net_paid_amount'] = df.groupby("ID")['paid'].diff().fillna(df['paid'])并且如果您不想在df中添加列,但在df_super,然后先创建一个副本,然后对df_super执行相同操作。请注意,两种方法的结果顺序不同 -
这正是我想要的。非常感谢 Ben.T !!
标签: python pandas dataframe parallel-processing