У меня есть два фрейма данных, которые выглядят следующим образом:

Df1 :

DATE        Value1  Value2
04.01.05    2.754   2.757
05.01.05    2.7316  2.7505
06.01.05    2.7546  2.7568
07.01.05    2.7465  2.7525
10.01.05    2.7385  2.7415
11.01.05    2.7348  2.7388
12.01.05    2.7348  2.7388
13.01.05    2.7348  2.7388
14.01.05    2.7365  2.7435
17.01.05    2.7365  2.7435
18.01.05    2.7365  2.7435
19.01.05    2.7365  2.7435

Df2 :

DATE        Value1  Value2
04.01.05    2.701   2.6995
05.01.05    2.7065  2.705
07.01.05    2.6348  2.6333
10.01.05    2.635   2.6315
11.01.05    2.6275  2.6265
12.01.05    2.6268  2.6253
13.01.05    2.6285  2.627
17.01.05    2.6565  2.6555
18.01.05    2.6275  2.626
19.01.05    2.643   2.6415

Если у меня точно такие же даты, мой код ниже работает. Как только даты не равны euqal, и я хочу рассчитать только даты, которые равны, это не работает. Мой оператор if почему-то не отфильтровывает правильные даты. Я хочу добавить рассчитанное значение к df1.

Мой код выглядит следующим образом:

import pandas as pd

file1 = 'File1.csv'
file2 = 'File2.csv'

df1 = pd.read_csv(file1, sep=';')
df1['DATE'] = pd.to_datetime(df1.DATE)

df2 = pd.read_csv(file2, sep=';')
df2['DATE'] = pd.to_datetime(df2.DATE)

for date1 in df1['DATE']:
    for date2 in df2['DATE']:
        if date1 == date2:
            print(date1, date2)
            df1['sub'] = df1.Value1 - df2.Value1

print(df1)

Ожидаемый результат будет следующим:

DATE        Value1  Value2  LEVEL   sub
04.01.05    2.701   2.6995  1 Year  0.053
05.01.05    2.7065  2.705   1 Year  0.0251
07.01.05    2.6348  2.6333  1 Year  0.1117
10.01.05    2.635   2.6315  1 Year  0.1035
11.01.05    2.6275  2.6265  1 Year  0.1073
12.01.05    2.6268  2.6253  1 Year  0.108
13.01.05    2.6285  2.627   1 Year  0.1063
17.01.05    2.6565  2.6555  1 Year  0.08
18.01.05    2.6275  2.626   1 Year  0.109
19.01.05    2.643   2.6415  1 Year  0.0935

Это означает, что для одинаковых дат будет рассчитана только разница.

1
NewNY1990 2 Сен 2020 в 18:43

2 ответа

Лучший ответ

Сначала установите индекс на 'DATE', чтобы он выровнялся. Затем вычитаем. Поскольку вы, кажется, хотите, чтобы вывод был добавлен в df2, мы сделаем -(df2 - df1), что аналогично (df1 - df2)

df1 = df1.set_index('DATE')
df2 = df2.set_index('DATE')

df2['sub'] = -df2['Value1'].sub(df1['Value1'])

          Value1  Value2     sub
DATE                            
04.01.05  2.7010  2.6995  0.0530
05.01.05  2.7065  2.7050  0.0251
07.01.05  2.6348  2.6333  0.1117
10.01.05  2.6350  2.6315  0.1035
11.01.05  2.6275  2.6265  0.1073
12.01.05  2.6268  2.6253  0.1080
13.01.05  2.6285  2.6270  0.1063
17.01.05  2.6565  2.6555  0.0800
18.01.05  2.6275  2.6260  0.1090
19.01.05  2.6430  2.6415  0.0935
1
ALollz 2 Сен 2020 в 18:20
# this will result in merged df wtih all intersecting dates
df1 = df1.merge(df2, on = 'DATE', suffixes=('','_df2')
# the column you need
df1['sub'] = df1['Value1'] - df1['Value1_df2'] 
# next drop unnecessary columns of df2
df1.drop(columns = ['Value1_df2', 'Value2_df2'], inplace=True)
0
Artyom Akselrod 3 Сен 2020 в 07:00