Умножение pandas dataframe и series, поэлементно

#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 .