Связывание имен столбцов с данными из другого DataFrame - PullRequest
1 голос
/ 29 мая 2020

Итак, у меня есть три DataFrames:

  1. Один, содержащий количество продаж на элемент (строку) в день (столбец).
  2. Один, содержащий столбец со всеми днями и столбец с неделями.
  3. Один, содержащий столбец со всеми элементами, их недельную цену и столбец с неделями.

Я бы хотел изменить первое таблица, чтобы вместо отображения продаж отображалось это число, умноженное на цену товара в тот день. То есть (псевдокод):

for all items (rows) and days (columns) in table1:

   table1(item, day) = table1(item, day) * table3.prices(item, table2.weeks(day))

И я бы хотел избежать циклов и использовать Pandas операции.

EDIT:

Таблица 1 выглядит примерно так:

+-------+------+------+------+
|  item | day1 | day2 | day3 |
+-------+------+------+------+
| item1 |   0  |   2  |   3  |
+-------+------+------+------+
| item2 |   1  |   5  |   3  |
+-------+------+------+------+
| item3 |  12  |   7  |   8  |
+-------+------+------+------+

Таблица 2:

+------+-------+
|  day |  week |
+------+-------+
| day1 | week1 |
+------+-------+
| day2 | week2 |
+------+-------+
| day3 | week2 |
+------+-------+

Таблица 3:

+-------+-------+-------+
|  item |  week | price |
+-------+-------+-------+
| item1 | week1 |   3   |
+-------+-------+-------+
| item1 | week1 |   4   |
+-------+-------+-------+
| item2 | week2 |   7   |
+-------+-------+-------+
| item2 | week2 |   9   |
+-------+-------+-------+
| item3 | week1 |   2   |
+-------+-------+-------+
| item3 | week2 |   3   |
+-------+-------+-------+

Следовательно, ожидаемый результат будет (если я правильно рассчитал):

+-------+------+------+------+
|  item | day1 | day2 | day3 |
+-------+------+------+------+
| item1 |   0  |   8  | 12   |
+-------+------+------+------+
| item2 |   7  |  45  | 27   |
+-------+------+------+------+
| item3 |  24  |  21  | 24   |
+-------+------+------+------+

1 Ответ

2 голосов
/ 30 мая 2020

Я бы сделал двойное слияние:

# stack the fist table so we can use `day` information
s=tbl1.melt('item', value_name='unit', var_name='day')

(s.merge(tbl3.merge(tbl2,on='week',how='inner'),
       on=['item','day'], how='outer')
  .assign(total=lambda x: x['unit']*x['price'])
   .pivot(index='item',columns='day',values='total')
)

Вывод:

day    day1  day2  day3
item                   
item1     0     8    12
item2     7    45    27
item3    24    21    24

Обновить :

Другой способ - чтобы получить дневную цену по дням и умножить:

daily = (tbl3.merge(tbl2,on='week',how='inner')
     .set_index(['item','day']).price
     .unstack()
)

output = tbl1.set_index('item') * daily

Результат:

       day1  day2  day3
item                   
item1     0     8    12
item2     7    45    27
item3    24    21    24
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...