2017-10-27 1 views
-1

私はこのようなデータフレームがあります。私はSellPriceを計算する行を選択し、条件に基づいて値を割り当てる方法は?

Id row  Date  BuyPrice SellPrice Time 
1 1  2017-10-30 94520  0   9:00:00 
1 2  2017-10-30 94538  0   9:00:00 
1 3  2017-10-30 94609  0   9:00:00 
1 4  2017-10-30 94615  0   9:00:00 
1 5  2017-10-30 94617  0   9:00:00 
1 1  2017-09-20 99100  99159  9:00:10 
1 2  2017-09-20 99102  99058  9:00:11 
1 3  2017-09-20 99103  99057  9:00:12 
1 4  2017-09-20 99104  99056  9:00:10 
1 5  2017-09-20 99105  99055  9:00:10 
1 1  2017-09-20 98100  99190  9:01:10 
1 2  2017-09-20 98099  99091  9:01:10 
1 3  2017-09-20 98098  99092  9:01:10 
1 4  2017-09-20 98097  99093  9:01:10 
1 5  2017-09-20 98096  99094  9:01:10 
2 1  2010-11-01 99890  100000  10:00:02 
2 2  2010-11-01 99899  100000  10:00:02 
2 3  2010-11-01 99901  99899  9:00:02 
2 4  2010-11-01 99920  99850  10:00:02 
2 5  2010-11-01 99933  99848  10:00:23 

- 列「行」は、(それぞれの日と個別IDのため)1に等しい行のBuyPriceを。 BuyPriceまたはSellPriceが0の場合は、NaNを割り当てる必要があります。

ターゲット出力は次のようになります。

df1 = df.groupby(['SID','Date'], sort=False) 
df1['Spread'] =np.where((df['row']==1).eq(0).any(1),np.nan,df['SellPrice']-df['BuyPrice']) 

をしかし、私はこのエラーを取得しています:

Id row  Date   BuyPrice SellPrice Spread 
1 1  2017-10-30 94520  0   NaN 
1 1  2017-09-20 99100  99159  59 
1 1  2017-09-20 98100  99190  90 
2 1  2010-11-01 99890  100000  110 

ここで私はこれまで試したコードである

ValueError: No axis named 1 for object type <class 'pandas.core.series.Series'> 
+0

?また、ターゲット出力にはグループ化がありません。 'df [" row "] == 1'の行にフィルタリングするだけです。 – cmaher

+0

これは私の問題です。df ['row'] == 1を私のgroupbyに含めるべきですか? – ary

+0

私は日付とIDでグループ化していますが、行== 1 – ary

答えて

1

ここに表示されているように行がある場合。 groupbyは必要ありません。単純にqueryを使って@cmaherが示唆するように行をフィルタリングします。

df.query('row == 1').assign(Spread = 
          df['SellPrice'].mask(df['SellPrice'].eq(0)) - 
          df['BuyPrice']) 

出力:あなたがこれまでに試してみました何のコード

Id row  Date BuyPrice SellPrice  Time Spread 
0 1 1 2017-10-30  94520   0 9:00:00  NaN 
5 1 1 2017-09-20  99100  99159 9:00:10 59.0 
10 1 1 2017-09-20  98100  99190 9:01:10 1090.0 
15 2 1 2010-11-01  99890  100000 10:00:02 110.0 
関連する問題