Умножение столбцов в отдельном фрейме данных pandas на основе похожих значений столбцов

#python #pandas

#python #pandas

Вопрос:

Допустим, у меня есть 2 фрейма данных

 df1 = pd.DataFrame({'alpha': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'], 
                    'number': [1, 2, 3, 4, 5, 6, 7, 8, 9]})
  alpha  number
0     A       1
1     A       2
2     A       3
3     B       4
4     B       5
5     B       6
6     C       7
7     C       8
8     C       9

df2 = pd.DataFrame({'alpha': ['A', 'B', 'C'],
                    'mult': [2, 3, 4]})    
  alpha  mult
0     A     2
1     B     3
2     C     4
  

И я хочу создать 3-й фрейм данных, который будет умножать все значения в df1 на соответствующее значение ‘mult’ в df2 на основе конкретного альфа-значения. Решение будет выглядеть следующим образом:

 alpha  soln
0     A     2
1     A     4
2     A     6
3     B    12
4     B    15
5     B    18
6     C    28
7     C    32
8     C    36
  

Есть какие-нибудь советы о том, как это легко сделать?

Ответ №1:

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

 tmp = df1.merge(df2)

tmp
#   alpha  number  mult
# 0     A       1     2
# 1     A       2     2
# 2     A       3     2
# 3     B       4     3
# 4     B       5     3
# 5     B       6     3
# 6     C       7     4
# 7     C       8     4
# 8     C       9     4

df1.soln = tmp.number * tmp.mult
  

Это работает, хотя я чувствую, что должен быть и более простой, одноступенчатый способ.

РЕДАКТИРОВАТЬ — вот способ сделать это в одной строке:

 df1.soln = (df1.set_index("alpha").number * df2.set_index("alpha").mult).values
  

EDIT2 — вот еще одна строка, похожая на комментарий @scott-boston:

 df1.soln = df1.merge(df2).assign(soln=lambda df: df.number * df.mult).soln
  

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

1. df1.merge(df2).eval('soln = number * mult') для однострочного.

Ответ №2:

map multiply

Ваше объединение основано на одном столбце, ключ которого уникален в df2 , поэтому сопоставьте.

 df1['soln'] = df1.number.mul(df1.alpha.map(df2.set_index('alpha').mult))

#  alpha  number  soln
#0     A       1     2
#1     A       2     4
#2     A       3     6
#3     B       4    12
#4     B       5    15
#5     B       6    18
#6     C       7    28
#7     C       8    32
#8     C       9    36