我有两个数据集:
我想获取每个机车发送时间大于或等于 300 秒的消息数。
为了计算这个,我写了以下代码(数据帧 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”运算符时遇到了问题。它返回一个错误,指出代码过于模糊(?)。
问题: 有没有办法改进这段代码,而不必使用嵌套循环?
答案 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)