У меня есть следующие два кадра данных:
df1=
date col1
0 2023-01-01 16:00:00 100
1 2023-01-01 16:15:00 120
2 2023-01-01 16:30:00 140
3 2023-01-01 16:45:00 160
4 2023-01-01 17:00:00 200
5 2023-01-01 17:15:00 430
6 2023-01-01 17:30:00 890
df2 =
date col2 col3
0 2023-01-01 16:00:00 100 200
1 2023-01-01 16:15:00 120 400
2 2023-01-01 17:00:00 200 500
А в df2 у меня отсутствуют временные метки по сравнению с df1. Я могу найти эти метки времени, используя следующий код:
df1[~df1['date'].isin(df2['date'])]
Я хочу заполнить эти отсутствующие метки времени в df2 и заполнить значения столбцов средним значением двух предыдущих строк.
Таким образом, новый df2 должен выглядеть так:
df2 =
date col2 col3
0 2023-01-01 16:00:00 100 200
1 2023-01-01 16:15:00 120 400
2 2023-01-01 16:30:00 110 300
3 2023-01-01 16:45:00 115 350
4 2023-01-01 17:00:00 200 500
5 2023-01-01 17:15:00 257.5 425
6 2023-01-01 17:30:00 228.75 462.5
Не идеальное решение через итерацию:
df1 = [
['2023-01-01 16:00:00', 100],
['2023-01-01 16:15:00', 120],
['2023-01-01 16:30:00', 140],
['2023-01-01 16:45:00', 160],
['2023-01-01 17:00:00', 200],
['2023-01-01 17:15:00', 430],
['2023-01-01 17:30:00', 890],
]
df2 = [
['2023-01-01 16:00:00', 100, 200],
['2023-01-01 16:15:00', 120, 400],
['2023-01-01 17:00:00', 200, 500],
]
df1= pd.DataFrame(df1, columns = ['date', 'col1'])
df2= pd.DataFrame(df2, columns = ['date', 'col2', 'col3'])
missing = df1[~df1['date'].isin(df2['date'])]
missing = missing.drop(['col1'], axis=1)
merged = pd.concat([df2, missing])
merged.sort_values('date', inplace=True, ignore_index=True)
for index, row in merged.iterrows():
if np.isnan(row['col2']):
merged['col2'].at[index] = merged['col2'].iloc[[index-1, index-2]].mean()
if np.isnan(row['col3']):
merged['col3'].at[index] = merged['col3'].iloc[[index-1, index-2]].mean()
print(merged)
Выход:
@Pythoneer попробуйте этот ответ.
Заменив np.isnan на pd.isnull, проблема была решена. Однако я не могу понять причину этой ошибки, так как мой Dataframe не содержит object или string dtypes.
Когда я запускаю ваш код для полного фрейма данных для строки if np.isnan(row['fuell_cell']):, я получаю следующую ошибку TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''. Хотя я проверил типы своих переменных и они float64.