- Я работаю с двумя CSV-файлами и импортирую их как dataframe, df1 и df2
- df1 имеет 50000 строк, а df2 имеет 150000 строк.
- Я хочу сравнить (выполнить итерацию покаждая строка) «время» df2 с помощью df1, найдите разницу во времени и верните значения всех столбцов, соответствующих аналогичной строке, сохраните ее в df3 ( синхронизация времени )
- ДляНапример, 35427949712 (из 'time' в df1) ближайший или равен 35427949712 (из 'time' в df2), поэтому я хотел бы вернуть содержимое в df1 ('speed_x' и 'yaw') и df2 ('speed' и 'yawrate') и сохраните в df3
- . Для этого я использовал два метода, показанных в коде.
- Код 1 занимает очень много времени, чтобы выполнить 72 часа, что не практично, так как у меня много CSV-файлов
- Код 2 дает мне «ошибку памяти» и ядро умирает.
Было бы замечательно, если бы я получил более надежное решение для проблемы с учетом вычислительного времени, памяти и мощности (Intel Core i7-6700HQ, 8 ГБ ОЗУ)
Вотданные образца,
import pandas as pd
df1 = pd.DataFrame({'time': [35427889701, 35427909854, 35427929709,35427949712, 35428009860],
'velocity_x':[12.5451, 12.5401,12.5351,12.5401,12.5251],
'yaw' : [-0.0787806, -0.0784749, -0.0794889,-0.0795915,-0.0795472]})
df2 = pd.DataFrame({'time': [35427929709, 35427949712, 35427009860,35427029728, 35427049705],
'velocity':[12.6583, 12.6556,12.6556,12.6556,12.6444],
'yawrate' : [-0.0750492, -0.0750492, -0.074351,-0.074351,-0.074351]})
df3 = pd.DataFrame(columns=['time','velocity_x','yaw','velocity','yawrate'])
Code1
for index, row in df1.iterrows():
min=100000
for indexer, rows in df2.iterrows():
if abs(float(row['time'])-float(rows['time']))<min:
min = abs(float(row['time'])-float(rows['time']))
#storing the position
pos = indexer
df3.loc[index,'time'] = df1['time'][pos]
df3.loc[index,'velocity_x'] = df1['velocity_x'][pos]
df3.loc[index,'yaw'] = df1['yaw'][pos]
df3.loc[index,'velocity'] = df2['velocity'][pos]
df3.loc[index,'yawrate'] = df2['yawrate'][pos]
Code2
df1['key'] = 1
df2['key'] = 1
df1.rename(index=str, columns ={'time' : 'time_x'}, inplace=True)
df = df2.merge(df1, on='key', how ='left').reset_index()
df['diff'] = df.apply(lambda x: abs(x['time'] - x['time_x']), axis=1)
df.sort_values(by=['time', 'diff'], inplace=True)
df=df.groupby(['time']).first().reset_index()[['time', 'velocity_x', 'yaw', 'velocity', 'yawrate']]