python - 减少for循环时间

标签 python pandas dataframe for-loop

我正在对一个有 900 万条记录的数据帧进行数据转换,在整个数据帧上运行循环需要很长时间(约 20-25 分钟),下面是我的代码,任何人都可以帮助我增加for 循环的速度或任何替代循环的速度。 例如:

 account_angaza_id  cumulative_paid
0           AC002006           5000.0
1           AC002006           5000.0
2           AC002006              0.0
3           AC002006              0.0
4           AC002006              0.0
5           AC002006              0.0
6           AC002006              0.0
7           AC002006              0.0
8           AC002006              0.0
9           AC002006              0.0
10          AC002007           5000.0
11          AC002007              0.0
12          AC002007              0.0
13          AC002007              0.0
14          AC002007              0.0
15          AC002007              0.0
16          AC002007              0.0
17          AC002007              0.0
18          AC002007              0.0


for i in df_merged.index:
    if (df_merged.at[i+1,'cumulative_paid'] == 0 and df_merged.at[i+1,'account_angaza_id'] == df_merged.at[i,'account_angaza_id']):
        df_merged.at[i+1,'cumulative_paid'] = df_merged.at[i,'cumulative_paid']
        if i+1 == len(df_merged)-1:
            break

结果

 account_angaza_id  cumulative_paid
0           AC002006           5000.0
1           AC002006           5000.0
2           AC002006           5000.0
3           AC002006           5000.0
4           AC002006           5000.0
5           AC002006           5000.0
6           AC002006           5000.0
7           AC002006           5000.0
8           AC002006           5000.0
9           AC002006           6000.0
10          AC002007           6000.0
11          AC002007           6000.0
12          AC002007           6000.0
13          AC002007           6000.0
14          AC002007           6000.0
15          AC002007           6000.0
16          AC002007           6000.0
17          AC002007           6000.0
18          AC002007           6000.0

任何输入都会有帮助。

最佳答案

Pandas 专门从事矢量化操作,因此通常可以避免 Python 级别的循环。在这种情况下,您可以使用groupby。首先将 0 值转换为 NaN,然后使用 groupby + ffill 。这假设您的数据帧按 account_angaza_id 排序。

col = 'cumulative_paid'

# replace 0 with NaN using a Boolean mask
df[col] = df[col].mask(df[col].eq(0))

# forward fill values by group, then replace any NaN values with 0
df[col] = df.groupby('account_angaza_id')[col].ffill().fillna(0)

print(df)

   account_angaza_id  cumulative_paid
0           AC002006           5000.0
1           AC002006           5000.0
2           AC002006           5000.0
3           AC002006           5000.0
4           AC002006           5000.0
5           AC002006           5000.0
6           AC002006           5000.0
7           AC002006           5000.0
8           AC002006           5000.0
9           AC002006           5000.0
10          AC002007           5000.0
11          AC002007           5000.0
12          AC002007           5000.0
13          AC002007           5000.0
14          AC002007           5000.0
15          AC002007           5000.0
16          AC002007           5000.0
17          AC002007           5000.0
18          AC002007           5000.0

关于python - 减少for循环时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54291539/

相关文章:

python - 在 Id 和年份上合并两个数据框 pandas,其中年份缺少值

python - Pandas 数据框范围索引

python - 将复杂的数据帧行划分为 Pyspark 中的简单行

python - 索引超出范围 - Python 中的快速排序

python - 如何在 python 中将 qwidgettable 中的列设置为会计格式?

python - 基于列删除重复行 MySQL

python - 访问没有名称的列并从数据框中删除某些数据

python - 将 Pandas 系列列表转换为数据框

javascript - 从 POST 请求将文件保存到 Web 服务器

python - 获取相机的序列号 - Openni2 python