как я могу получить тип оператора и применить формулу к фрейму данных pandas

#python-3.x #pandas #dataframe

#python-3.x #панды #фрейм данных

Вопрос:

У меня есть строка python, подобная этой: str1='PRODUCT1_PRD/2 PRODUCT2_NON-PROD-PRODUCT3_NON-PRD/2' Здесь я хочу получить operator динамическим способом и на основе оператора, который я хочу выполнить определенную операцию.У меня есть фрейм данных pandas df, подобный этому:

 PRODUCT   PRD  NON-PORD
PRODUCT1  3      5
PRODUCT2  4      6
PRODUCT3  5      8
 

Вывод Я хочу получить переменную var1=(3/2) 6-(8/2)=3.5 после применения приведенной выше формулы. Как я могу сделать это наиболее эффективным способом?

Хочу отметить одну вещь: у меня есть несколько формул, подобных той, что я упомянул, все они находятся внутри списка строк. Поэтому я должен применять все эти формулы одну за другой.

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

1. является ли имя столбца НЕПРОИЗВОДНЫМ. Можно ли это изменить на НЕПРОИЗВОДСТВЕННЫЙ. Параметр — in NON-PROD конфликтует со знаком минус (-) для вычитания. Кроме того, вам может потребоваться отредактировать пример с помощью NON-PROD вместо NON-PORD

Ответ №1:

Сначала создайте MultiIndex Series с помощью DataFrame.set_index with DataFrame.stack и объедините значения индекса с помощью _ in map :

 s = df.set_index('PRODUCT').stack()
s.index = s.index.map('_'.join)
print (s)
PRODUCT1_PRD         3
PRODUCT1_NON-PROD    5
PRODUCT2_PRD         4
PRODUCT2_NON-PROD    6
PRODUCT3_PRD         5
PRODUCT3_NON-PROD    8
dtype: int64
 

Затем замените значения в строке на Series и вызовите pandas.eval :

 str1='PRODUCT1_PRD/2 PRODUCT2_NON-PROD-PRODUCT3_NON-PROD/2'

for k, v in s.items():
    str1 = str1.replace(k, str(v))
print (str1)
3/2 6-8/2

print (pd.eval(str1))
3.5