Я пытаюсь создать комбинацию концентраций двух химических веществ для эксперимента. Поскольку я хочу увидеть, какая комбинация обоих является лучшей, я хочу создать обзор того, сколько мне нужно добавить каждого в данной концентрации. До сих пор мне удалось создать две сводные_таблицы/фреймы данных каждого, но я почему-то не могу объединить их в один.
Итак, я пробовал этот подход до сих пор:
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
Мой желаемый результат будет примерно таким:
Кроме того, в чем причина создания переменной array
? Вы никогда не используете эту переменную после ее создания.
Аааа, массив — это реликт предыдущей попытки получить комбинацию того и другого. И это как раз моя проблема. Я не знаю, как предоставить входные данные для него через код. Единственной альтернативой будет ручной ввод входных данных. Но, в конце концов, я хотел бы сделать его масштабируемым кодом, где мне просто нужно изменить свои концентрации и количества, чтобы это дало мне результаты, так как мне нужно провести много тестов.
Что я обычно делаю для ввода данных, так это использую Excel для ввода данных, а затем читаю полученный файл csv или xls в DataFrame, используя read_csv() или read_excel().
Используйте 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 - ответ был отредактирован.
@Teigsta подумал, что мой ответ был более интуитивным, и я ответил (правильно) быстрее, чем парень с репутацией 773k .. в любом случае, просто хотел бы получить отзыв о моем ответе.
Приведенный ниже код должен быть тем, что вам нужно.
Я использую функцию продукта из библиотеки 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)
Эй, извините, я действительно использовал оба ответа. И я должен признать, что для моего будущего проекта я придерживался вашего пути, так как это было более удобно. Большое спасибо за это. Хотел бы я поставить вам большой палец вверх или что-нибудь за это.
Спасибо! Очень приятно знать, что вы использовали мой ответ! Удачи в будущих проектах. Если однажды вы наберете достаточно репутации, вы можете проголосовать за меня.
Ваши входные данные не имеют результата (например) 125 CinnamonicAcid и 400 Acetosyringone, так почему вы ожидаете, что эти значения будут иметь запись в сводной таблице? Если вы хотите получить сводную таблицу с записями для каждой комбинации коричной кислоты и ацетосирингона, вы должны предоставить входные данные со значением для каждой комбинации.