Среднее значение двух элементов фреймов данных pandas по результатам объединения элементов... почему?

у меня есть два фрейма данных:

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 столбца]

так как я могу этого добиться?

заранее спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
53
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)

Другие вопросы по теме