web-dev-qa-db-ja.com

pandasの条件に基づいて、python dataframeの2つの列の差を取る

「pricecomp_df」という名前のデータフレームがあります。「市場価格」列と「アップル価格」、「マンゴー価格」、「スイカ価格」などの他の各列の価格を比較しますが、条件に基づいて違いを優先します。 (最優先はスイカの価格、2番目はマンゴー、3番目はAppleです)。入力データフレームを以下に示します。

   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

したがって、ここでは最初の行にApple価格と市場価格があり、次にそれらの差分を取りますが、2番目の行にはアップル、マンゴーの価格があるので、市場価格とマンゴーの違いのみを取る必要があります。同様に、優先度の条件に基づいて差異を取得します。また、3つの価格すべてについて、nanを含む行をスキップします。

6
User1090

手遅れにならないように。考え方は、違いを計算し、優先順位リストに従ってそれらを上書きすることです。

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
21
MERose