У меня есть стол в пандах df

id   product_1   product_2   count  
1        100       200          10
2        200       600          20
3        100       500          30
4        400       100          40
5        500       700          50
6        200       500          60
7        100       400          70

Также у меня есть другая таблица в df2

product    price
100         5
200         10
300         15
400         20
500         25
600         30
700         35

Мне нужно создать новый столбец price_product2 в моем первом df, принимая значения цены из df2 относительно product_2. А также найдите процентную разницу product_2 по отношению к product_1 и сделайте еще один столбец %_diff.

То есть say product_1 = 100 and product_2 = 200. therefore product_2 is 200% of the price of 100.

Аналогично, если product_1 = 400 и product_2 = 100, это снижение цены. следовательно, product_2 составляет -25% от product_1.

Мой окончательный вывод должен быть. дф =

id   product_1   product_2    count  price_product_2  %_diff
1        100       200          10     10               +200
2        200       600          20     30               +300
3        100       500          30     25               +500
4        400       100          40     5                -25
5        500       700          50     35               +140
6        200       500          60     25               +250
7        100       400          70     20               -71.42

Есть идеи как этого добиться?

Я пытался использовать функции карты.

df['price_product_2'] = df['product_2'].map(df2.set_index('product_id')['price'])

Но я мог бы получить только один столбец, как я могу получить столбец %_diff?

1
Shubham R 12 Дек 2016 в 08:11

3 ответа

Лучший ответ

Решение с помощью map dict d с делением на div :

d = df2.set_index('product')['price'].to_dict()
df['price_product_2'] = df['product_2'].map(d)
df['price_product_1'] = df['product_1'].map(d)
df['diff']  = df['price_product_2'].div(df['price_product_1']).mul(100)
print (df)
   id  product_1  product_2  count  price_product_2  price_product_1   diff
0   1        100        200     10               10                5  200.0
1   2        200        600     20               30               10  300.0
2   3        100        500     30               25                5  500.0
3   4        400        100     40                5               20   25.0
4   5        500        700     50               35               25  140.0
5   6        200        500     60               25               10  250.0
6   7        100        400     70               20                5  400.0

Но кажется, что требуется только деление, если несколько столбцов с одинаковыми константами product_1 и product_2, то разница такая же:

df['diff1']  = df['product_2'].div(df['product_1']).mul(100)
print (df)
   id  product_1  product_2  count  diff1
0   1        100        200     10  200.0
1   2        200        600     20  300.0
2   3        100        500     30  500.0
3   4        400        100     40   25.0
4   5        500        700     50  140.0
5   6        200        500     60  250.0
6   7        100        400     70  400.0
1
jezrael 12 Дек 2016 в 06:16

Предположим, у вас есть следующие фреймы данных:

In [32]: df1
Out[32]:
   index  id  product_1  product_2  count
0      0   1        100        200     10
1      1   2        200        600     20
2      2   3        100        500     30
3      3   4        400        100     40
4      4   5        500        700     50
5      5   6        200        500     60
6      6   7        100        400     70

In [33]: df2
Out[33]:
   product  price
0      100      5
1      200     10
2      300     15
3      400     20
4      500     25
5      600     30
6      700     35

Вероятно, проще просто установить product в качестве индекса для df2:

In [35]: df2.set_index('product', inplace=True)

In [36]: df2
Out[36]:
         price
product
100          5
200         10
300         15
400         20
500         25
600         30
700         35

Тогда вы можете сделать что-то вроде следующего:

In [37]: df2.loc[df1['product_2']]
Out[37]:
         price
product
200         10
600         30
500         25
100          5
700         35
500         25
400         20

Используйте значения явно, чтобы установить, иначе индекс продукта испортит вещи:

In [38]: df1['price_product_2'] = df2.loc[df1['product_2']].values

In [39]: df1
Out[39]:
   index  id  product_1  product_2  count  price_product_2
0      0   1        100        200     10               10
1      1   2        200        600     20               30
2      2   3        100        500     30               25
3      3   4        400        100     40                5
4      4   5        500        700     50               35
5      5   6        200        500     60               25
6      6   7        100        400     70               20

Для разницы в процентах вы также можете использовать векторизованные операции:

In [40]: df1.product_2 / df1.product_1 * 100
Out[40]:
0    200.0
1    300.0
2    500.0
3     25.0
4    140.0
5    250.0
6    400.0
dtype: float64
2
juanpa.arrivillaga 12 Дек 2016 в 05:40

Используйте merge (или map) дважды, один раз для каждого продукта, затем рассчитайте разницу.

# Add prices for products 1 and 2
df3 = (df1.
       merge(df2, left_on='product_1', right_on='product').
       merge(df2, left_on='product_2', right_on='product'))

# Calculate the percent difference
df3['pct_diff'] = (df3.price_y - df3.price_x) / df3.price_x
3
David 12 Дек 2016 в 05:34