Построение 2D-поверхности из функции, содержащей умножение элементов фрейма данных

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть 2 таблицы (фреймы данных), в каждой по 2 столбца. Допустим M1["a1","b1"] , и M2["a2","b2"] . (M1 и M2 на самом деле относятся к одному и тому же csv. Я просто описываю их как две таблицы из-за функции G ниже.)

У меня также есть функция G = a1*b1*a2*b2 a1*b1 . Просто чтобы сделать мой вопрос более понятным, я бы написал function G as G(n,m) = a1(n)*b1(n)*a2(m)*b2(m) a1(n)*b1(n) и хотел бы упомянуть, что (a1[n],b1[n]) всегда входят в фиксированную пару, т. Е. Нет (a1[3], b1[5]) .

Позже я хочу построить эту функцию G n , которая соответствует оси x и m соответствует оси y. Само значение G будет соответствовать оси z. Конечная цель — найти, какое (a,b) pair из них дает минимальное значение G , если таковое имеется.

Как я должен написать функцию G на python?

Написание следующего просто выдает ошибку.

 for n in a1,b1:
    for m in a2,b2:
        G = a1*b1*a2*b2   a1*b1 #works, but the result consists only 1 column
        G[:,:] = a1[n]*b1[n]*a2[m]*b2[m]   a1[n]*b1[n] #error
        print(G)
 

Я использовал более простые имена переменных выше, чтобы упростить сообщение.
Вот мой реальный код.

 NMOS_gm_gmid = pandas.read_csv('NMOS_gm_gmid.csv', sep=',' , encoding='UTF-8')
NMOS_gm_gmid = NMOS_gm_gmid.apply(pandas.to_numeric, errors='coerce')
NMOS_ro_gmid = pandas.read_csv('NMOS_ro_gmid.csv', sep=',' , encoding='UTF-8')
NMOS_ro_gmid = NMOS_ro_gmid.apply(pandas.to_numeric, errors='coerce')

gm1 = NMOS_gm_gmid.iloc[:10,2] 
ro1 = 1 / NMOS_ro_gmid.iloc[:10,2] * 1e6

gm2 = NMOS_gm_gmid.iloc[:10,2]
ro2 = 1 / NMOS_ro_gmid.iloc[:10,2] * 1e6

Gm = gm1*ro1*gm2*ro2   gm1*ro1
 

Ответ №1:

Вы можете использовать numpy broadcast здесь:

 # M1, M2 from the same dataframe:
a1,b1,a2,b2 = df[['a1','b1','a2','b2']].to_numpy().T

G = (a1 * b1   1) * (a2*b2)[:,None]
 

Комментарии:

1. возникает эта ошибка: KeyError: "['a1' 'b1' 'a2' 'b2'] not in index"

2. Это вытекает из вашего вопроса, скажем, M1 [«a1″,»b1»] и M2 [«a2″,»b2»]. (M1 и M2 фактически относятся к одному и тому же csv) . Если вы получаете ошибку ключа, то я не уверен, что вы имели в виду под этим.

3. Хм … M1 и M2 — это имя таблицы. a # и b # — это имена столбцов. Извините, если я не понял. Я новичок в этом.

4. Да, и я не понимаю, почему вы говорите, что M1 и M2 относятся к одному и тому же csv . В любом случае, разделите их a1,b1 = M1[['a1','b1']].to_numpy().T и то же самое для a2,b2 .

5. хм … у меня та же ошибка: KeyError: "['a1' 'b1'] not in index" я поместил свой реальный код в свой пост, может быть, вы хотели бы взглянуть.