у меня есть два фрейма данных:
print(d1.head())
Codes Prof Amp
477 0.7 3.0 0.724997
478 0.7 3.0 0.736914
479 0.7 3.0 0.612189
480 0.7 3.0 0.684321
481 0.7 3.0 0.950067
print(d1.shape)
(96, 3)
print(d2.head())
Codes Prof Amp
0 0.8 5.0 0.747135
1 0.8 5.0 1.370311
2 0.8 5.0 0.759630
3 0.8 5.0 1.125687
4 0.8 5.0 1.910926
print(d2.shape)
(96, 3)
когда я использую следующий код:
dataM = d1.add(d2, fill_value=0)
Code Prof Amp
0 0.8 5.0 0.747135
1 0.8 5.0 1.370311
2 0.8 5.0 0.759630
3 0.8 5.0 1.125687
4 0.8 5.0 1.910926
print(dataM.shape)
[192 rows x 3 columns]
но моя цель
Code Prof Amp
0 1.5 8.0 1.472132
...... и форма должна быть такой же [96 строк x 3 столбца]
так как я могу этого добиться?
заранее спасибо.
Причиной является выравнивание данных по значениям индекса - поскольку разные значения индекса DataFrames объединяются (и делятся на 2):
dataM = d1.add(d2, fill_value=0).div(2)
print (dataM)
Codes Prof Amp
0 0.40 2.5 0.373567
1 0.40 2.5 0.685156
2 0.40 2.5 0.379815
3 0.40 2.5 0.562844
4 0.40 2.5 0.955463
477 0.35 1.5 0.362499
478 0.35 1.5 0.368457
479 0.35 1.5 0.306094
480 0.35 1.5 0.342160
481 0.35 1.5 0.475033
Нужны одинаковые значения индекса в обоих DataFrames, поэтому добавьте DataFrame.reset_index с drop=True
и для среднего деления на 2
:
dataM = d1.reset_index(drop=True).add(d2.reset_index(drop=True), fill_value=0).div(2)
print (dataM)
Codes Prof Amp
0 0.75 4.0 0.736066
1 0.75 4.0 1.053613
2 0.75 4.0 0.685909
3 0.75 4.0 0.905004
4 0.75 4.0 1.430496
Другая идея — преобразовать в массив numpy и разделить на 2
:
dataM = d1.add(d2.to_numpy(), fill_value=0).div(2)
Ваши фреймы данных не выровнены, вам следует преобразовать d2
в numpy с помощью to_numpy:
out = d1.add(d2.to_numpy(), fill_value=0).div(2)
Выход:
Codes Prof Amp
477 0.75 4.0 0.736066
478 0.75 4.0 1.053613
479 0.75 4.0 0.685909
480 0.75 4.0 0.905004
481 0.75 4.0 1.430496
Операция завершается неудачно, поскольку ваши индексы не выровнены: значения индексов первого DataFrame начинаются с 477, а второго — с 0.
См. pandas.add: несовпадающие индексы будут объединены вместе.
Чтобы выровнять индексы первого DataFrame со вторым, вы можете использовать d1.reset_index(drop=True)
.
dataM = d1.reset_index(drop=True).add(d2, fill_value=0)
print(dataM.shape)
# >>> (96, 3)