#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