#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