在另一个数据帧中添加数据帧中的列,执行一些算术计算python

时间:2016-12-12 05:11:43

标签: python pandas

我在pandas 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

我必须在我的第一个df中创建一个新列price_product2,从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 and product_2 = 100, it is a decline in price. therefore product_2 is -25% of product_1.

我的最终输出应该是。 df =

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列?

3 个答案:

答案 0 :(得分:3)

使用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

答案 1 :(得分:2)

假设您有以下数据框:

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 :(得分:1)

dict d 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 的解决方案除以map

product_1

但是,如果多个相同的常数列product_2df['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 ,那么似乎只有划分,那么差异是相同的:

android:layout_height="?attr/actionBarSize"