Как объединить два фрейма данных в одну сводную таблицу?

Я пытаюсь создать комбинацию концентраций двух химических веществ для эксперимента. Поскольку я хочу увидеть, какая комбинация обоих является лучшей, я хочу создать обзор того, сколько мне нужно добавить каждого в данной концентрации. До сих пор мне удалось создать две сводные_таблицы/фреймы данных каждого, но я почему-то не могу объединить их в один.

Итак, я пробовал этот подход до сих пор:

import numpy as np
import pandas as pd


array_CinA = np.array([0,125,250,500,1000])
array_Aceto = np.array([0,100,200,400,800])
vol_cina = [0, 5, 10, 20, 40]
vol_as = [0, 2, 4,8,16]

array = np.array(np.meshgrid(array_CinA,array_Aceto)).T.reshape(-1,2)

df = pd.DataFrame({"CinnamonicAcid":array_CinA,
                   "Acetosyringone":array_Aceto,
                   "VolCinA": vol_cina,
                   "VolAS": vol_as})

pivtab = df.pivot_table(index = "CinnamonicAcid", columns = "Acetosyringone", values=["VolCinA", "VolAS"])
#pivtab.to_excel
print(pivtab)

Что дает мне следующий вывод:

               VolAS                      VolCinA                       
Acetosyringone   0    100  200  400   800     0    100   200   400   800
CinnamonicAcid                                                          
0                0.0  NaN  NaN  NaN   NaN     0.0  NaN   NaN   NaN   NaN
125              NaN  2.0  NaN  NaN   NaN     NaN  5.0   NaN   NaN   NaN
250              NaN  NaN  4.0  NaN   NaN     NaN  NaN  10.0   NaN   NaN
500              NaN  NaN  NaN  8.0   NaN     NaN  NaN   NaN  20.0   NaN
1000             NaN  NaN  NaN  NaN  16.0     NaN  NaN   NaN   NaN  40.0

Мой желаемый результат будет примерно таким:

Как объединить два фрейма данных в одну сводную таблицу?

Ваши входные данные не имеют результата (например) 125 CinnamonicAcid и 400 Acetosyringone, так почему вы ожидаете, что эти значения будут иметь запись в сводной таблице? Если вы хотите получить сводную таблицу с записями для каждой комбинации коричной кислоты и ацетосирингона, вы должны предоставить входные данные со значением для каждой комбинации.

The Photon 25.11.2022 08:04

Кроме того, в чем причина создания переменной array? Вы никогда не используете эту переменную после ее создания.

The Photon 25.11.2022 08:09

Аааа, массив — это реликт предыдущей попытки получить комбинацию того и другого. И это как раз моя проблема. Я не знаю, как предоставить входные данные для него через код. Единственной альтернативой будет ручной ввод входных данных. Но, в конце концов, я хотел бы сделать его масштабируемым кодом, где мне просто нужно изменить свои концентрации и количества, чтобы это дало мне результаты, так как мне нужно провести много тестов.

Teigsta 25.11.2022 08:49

Что я обычно делаю для ввода данных, так это использую Excel для ввода данных, а затем читаю полученный файл csv или xls в DataFrame, используя read_csv() или read_excel().

The Photon 25.11.2022 17:18
Почему в 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
4
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте numpy.broadcast_to для новых 2d-массивов и разделите их, затем перейдите к конструктору DataFrame:

array_CinA = np.array([0,125,250,500,1000])
array_Aceto = np.array([0,100,200,400,800])
vol_cina = [0, 5, 10, 20, 40]
vol_as = [0, 2, 4,8,16]

shape = (len(array_Aceto), len(array_CinA))

arr = np.core.defchararray.add(np.array(vol_cina).astype(str), '/')[:, None]

a1 = np.broadcast_to(arr, shape)
a2 = np.broadcast_to(np.array(vol_as).astype(str), shape)

df = (pd.DataFrame(np.core.defchararray.add(a1, a2), index=array_CinA, columns=array_Aceto))
print (df)
       0     100   200   400    800
0      0/0   0/2   0/4   0/8   0/16
125    5/0   5/2   5/4   5/8   5/16
250   10/0  10/2  10/4  10/8  10/16
500   20/0  20/2  20/4  20/8  20/16
1000  40/0  40/2  40/4  40/8  40/16

Спасибо, так что с трансляцией я мог собрать их вместе. Однако я не хочу их разделять. / должен был просто разделить два числа. Я хотел бы в основном объединить два целых числа в одну строку, состоящую из обоих целых чисел. Есть ли функция, которая это делает? или мне тогда нужно создать цикл?

Teigsta 25.11.2022 09:45

@Teigsta - ответ был отредактирован.

jezrael 25.11.2022 10:10

@Teigsta подумал, что мой ответ был более интуитивным, и я ответил (правильно) быстрее, чем парень с репутацией 773k .. в любом случае, просто хотел бы получить отзыв о моем ответе.

Atanas Atanasov 25.11.2022 12:49

Приведенный ниже код должен быть тем, что вам нужно.

Я использую функцию продукта из библиотеки intertools для создания полных данных. Затем я просто конвертирую в строковый тип, чтобы numpy не запутался, и я его изменяю. Наконец, я создаю фреймворк данных, предоставляющий имена индексов и имена столбцов.

import numpy as np
import pandas as pd
from itertools import product

array_CinA = np.array([0, 125, 250, 500, 1000])
array_Aceto = np.array([0, 100, 200, 400, 800])
vol_cina = [0, 5, 10, 20, 40]
vol_as = [0, 2, 4, 8, 16]


# creating full data
my_product = list(product(vol_cina, vol_as))
# converting to str
my_product_str = [str(a) for a in my_product]
# converting to np array
my_product_str_np = np.array(my_product_str)
# reshaping
my_product_str_np = my_product_str_np.reshape(len(vol_cina), len(vol_as))
# producing final data
df = pd.DataFrame(my_product_str_np, index=array_CinA, columns=array_Aceto)
df.index.name = "CinnamonicAcid"
df.columns.name = "Acetosyringone"
print(df)

Эй, извините, я действительно использовал оба ответа. И я должен признать, что для моего будущего проекта я придерживался вашего пути, так как это было более удобно. Большое спасибо за это. Хотел бы я поставить вам большой палец вверх или что-нибудь за это.

Teigsta 16.01.2023 08:58

Спасибо! Очень приятно знать, что вы использовали мой ответ! Удачи в будущих проектах. Если однажды вы наберете достаточно репутации, вы можете проголосовать за меня.

Atanas Atanasov 16.01.2023 10:23

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