Python - 避免嵌套的“for”循环以提高代码效率

时间:2021-02-16 22:47:22

标签: python python-3.x dataframe

我有两个数据集:

  • 第一个数据集表示一个包含机车信息的表格。
  • 第二个数据集表示一个表格,其中包含机车和控制中心之间交换的信息

我想获取每个机车发送时间大于或等于 300 秒的消息数。

enter image description here

为了计算这个,我写了以下代码(数据帧 1 是 'df_loco',数据帧 2 是 'df_sent'):

    for i in range(0, len(df_loco['LOCO']),1):
      for j in range(0,len(df_sent['HM_ID_HM']),1):
        if (df_sent.iloc[j,1] == df_loco.iloc[i,0]) and (df_sent.iloc[j,11]>=a):
            df_loco.iloc[i,4] += 1

代码完成了这项工作,并为我提供了正确的延迟消息数量。但是,我的数据集很大(数据帧 1 是 300+ 行,数据帧 2 是 55.000+)所以执行它需要很长时间。

我已经能够摆脱部分代码中的嵌套 for 循环,这使其效率提高了 100 倍。但是在这里,我在不使用“for”循环的情况下实现“and”运算符时遇到了问题。它返回一个错误,指出代码过于模糊(?)。

问题: 有没有办法改进这段代码,而不必使用嵌套循环?

1 个答案:

答案 0 :(得分:1)

使用 Pandas,您可以使用左连接合并 2 个数据帧,过滤 DELIVERY_TIME > 300,然后使用 groupby 获取 LOCO_ID 的计数。

import pandas as pd

df_loco = pd.DataFrame({'LOCO_ID':[123, 456, 789, 321]})
df_sent = pd.DataFrame({'MESSAGE_ID':range(1, 7),'LOCO_ID':[456, 123, 123, 321, 789, 123], 'DELIVERY_TIME':[14,800, 420,310,60, 14]})

merged_dataframe = df_loco.merge(df_sent, how='left')

count_dataframe = merged_dataframe[merged_dataframe['DELIVERY_TIME']>300].groupby('LOCO_ID')['LOCO_ID'].count()

print(count_dataframe)
相关问题