在Python中,根据条件获取Pandas数据框两列之间的差异

11

我有一个名为pricecomp_df的数据帧,我想对比“市场价格”列和其他列(如“苹果价格”,“芒果价格”,“西瓜价格”)的价格,但基于以下条件优先考虑差异:(首要考虑西瓜价格,其次是芒果,第三是苹果)。给出了输入数据帧如下:

   code  apple price  mangoes price  watermelon price  market price
0   101          101            NaN               NaN           122
1   102          123            123               NaN           124
2   103          NaN            NaN               NaN           123
3   105          123            167               NaN           154
4   107          165            NaN               177           176
5   110          123            NaN               NaN           123

所以这里第一行只有苹果价格和市场价格,然后取它们的差异,但在第二行中,我们有苹果、芒果价格,所以我只需要取市场价格和芒果价格之间的差异。根据优先条件进行差异处理。同样跳过所有三个价格都为 NaN 的行。有人可以帮忙吗?

1个回答

30

希望我没有来得太晚。这个想法是计算差异并根据您的优先级列表覆盖它们。

import numpy as np
import pandas as pd

df = pd.DataFrame({'code': [101, 102, 103, 105, 107, 110],
                   'apple price': [101, 123, np.nan, 123, 165, 123],
                   'mangoes price': [np.nan, 123, np.nan, 167, np.nan, np.nan],
                   'watermelon price': [np.nan, np.nan, np.nan, np.nan, 177, np.nan],
                   'market price': [122, 124, 123, 154, 176, 123]})

# Calculate difference to apple price
df['diff'] = df['market price'] - df['apple price']
# Overwrite with difference to mangoes price
df['diff'] = df.apply(lambda x: x['market price'] - x['mangoes price'] if not np.isnan(x['mangoes price']) else x['diff'], axis=1)
# Overwrite with difference to watermelon price
df['diff'] = df.apply(lambda x: x['market price'] - x['watermelon price'] if not np.isnan(x['watermelon price']) else x['diff'], axis=1)

print df
   apple price  code  mangoes price  market price  watermelon price  diff
0          101   101            NaN           122               NaN    21
1          123   102            123           124               NaN     1
2          NaN   103            NaN           123               NaN   NaN
3          123   105            167           154               NaN   -13
4          165   107            NaN           176               177    -1
5          123   110            NaN           123               NaN     0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接