#python #pandas
#python #pandas
Вопрос:
Допустим, у меня есть серия pandas:
import pandas as pd
x = pd.DataFrame({0: [1,2,3], 1: [4,5,6], 2: [7,8,9] })
y = pd.Series([-1, 1, -1])
Я хочу умножить x и y таким образом, чтобы получить z:
z = pd.DataFrame({0: [-1,2,-3], 1: [-4,5,-6], 2: [-7,8,-9] })
Другими словами, если элемент j ряда равен -1, то все элементы j-й строки x умножаются на -1. Если элемент k ряда равен 1, то все элементы j-й строки x умножаются на 1.
Как мне это сделать?
Комментарии:
1.
x.apply(lambda col: col*y)
?2. Спасибо! Это сработало отлично.
3. Вы также можете попробовать
(x.T * y).T
.
Ответ №1:
Вы можете это сделать:
>>> new_x = x.mul(y, axis=0)
>>> new_x
0 1 2
0 -1 -4 -7
1 2 5 8
2 -3 -6 -9
Комментарии:
1. Спасибо! Это также полезно для меня. Просто замечание, мы можем написать new_x = x.mul(y.values, axis=0), если мы не хотим заботиться об индексах
2. @AlexanderChervov хотя конечный результат (
new_x
), даже если вы используетеy.values
, содержит индексы — но да, это тоже работает!
Ответ №2:
Добавление к лучшему ответу: если функция возвращает кучу бессмысленных NAN, вы должны умножить на значения рассматриваемого ряда следующим образом:
new_x = df.mul(s.values, axis=0)
Ответ №3:
Как указывает Абду, ответ таков
z = x.apply(lambda col: col*y)
Более того, если вместо этого у вас есть фрейм данных, например
y = pandas.DataFrame({"colname": [1,-1,-1]})
Затем вы можете сделать
z = x.apply(lambda z: z*y["colname"])
Комментарии:
1. вы не должны использовать apply в pandas с фреймами данных. Это желание смерти. Оооочень медленно!
Ответ №4:
Вы можете умножать фреймы данных напрямую.
x * y
Комментарии:
1. Это умножается на строки; вы хотите сначала перенести его, умножить, а затем снова перенести :
(x.T * y).T
.