Выполнить вычисления для разных групп python pandas

#python #pandas #data-manipulation

#python #pandas #манипулирование данными

Вопрос:

У меня есть набор данных pandas с разными группами. Для каждой группы я хочу применить разные вычисления. Каков наилучший способ сделать это?

Например,

Входные данные

 Group val1 val2
1      12   3
1      19   4
2      23   9
3      59   74
3      2    44
  

Выходные данные

 Group val1 val2 output
1      12   3   3*val1*val2
1      19   4   3*val1*val2
2      23   9   5*val1*val2
3      59   74  10*val1*val2
3      2    44  10*val1*val2
  

Ответ №1:

Вам необходимо создать сопоставление / словарь d , чтобы связать группы с их расчетными значениями. Затем map перейдите к столбцам Group и используйте numpy ufunc `reduce of multiply для создания желаемого результата

 import numpy as np

d = {1: 3, 2: 5, 3: 10}
df['output'] = np.multiply.reduce([df.Group.map(d), df.val1, df.val2])

Out[243]:
   Group  val1  val2  output
0      1    12     3     108
1      1    19     4     228
2      2    23     9    1035
3      3    59    74   43660
4      3     2    44     880
  

Если вы не хотите использовать numpy, просто выполните умножение каждого столбца

 df['output'] = df.Group.map(d) * df.val1 * df.val2
  

Ответ №2:

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

 dct = {1:3, 2:5, 3:10}
df['output'] = df['Group'].map(dct).astype(str)   '*val1*val2'
df
Out[1]: 
   Group  val1  val2        output
0      1    12     3   3*val1*val2
1      1    19     4   3*val1*val2
2      2    23     9   5*val1*val2
3      3    59    74  10*val1*val2
4      3     2    44  10*val1*val2
  

Теперь я взял ваш вывод дословно, но если вы пытаетесь умножить эти значения :), то вы можете добиться этого следующим образом:

 dct = {1:3, 2:5, 3:10}
df['output'] = df['Group'].map(dct) * df['val1'] * df['val2']
df
Out[1]: 
   Group  val1  val2  output
0      1    12     3     108
1      1    19     4     228
2      2    23     9    1035
3      3    59    74   43660
  

Ответ №3:

Я думаю, вы могли бы использовать apply

 df.groupby([“group”, “val1”, “val2”]).apply(lambda x: x)