2016-04-22 7 views
2

私は、DFデータフレームを使用している場合:パンダ:最大値を見つけ、ときに条件が

id volume saturation time_delay_normalised speed BPR_free_speed BPR_speed Volume time_normalised 
27WESTBOUND 580 0.351515152 57 6.54248366 17.88 15.91366177 580 1.59375 
27WESTBOUND 588 0.356363636 100 5.107142857 17.88 15.86519847 588 2.041666667 
27WESTBOUND 475 0.287878788 64 6.25625 17.88 16.51161331 475 0.666666667 
27EASTBOUND 401 0.243030303 59 6.458064516 17.88 16.88283672 401 1.0914583333 
27EASTBOUND 438 0.265454545 46 7.049295775 17.88 16.70300418 438 1.479166667 
27EASTBOUND 467 0.283030303 58 6.5 17.88 16.55392848 467 0.9604166667 

私は、ときIDごとに、free_capacityを新しい列を作成し、Volumeの最大値として設定したいですtime_normalisedはtime_normalised条件を考慮せずに1.1

以下であり、私はこれを行うことができます。

df['free_capacity'] = df.groupby('id')["Volume"].transform('max') 

はどのように行いますtime_normalised <= 1.1の条件を追加しますか?

EDIT

@jezraelが示唆次与え

df.loc[df['time_normalised'] <= 1.1, 'free_capacity'] = df.loc[df['time_normalised'] <= 1.1].groupby('id')["Volume"].transform('max') 

id volume saturation time_delay_normalised  speed \ 
27WESTBOUND  580 0.351515      57 6.542484 
27WESTBOUND  588 0.356364     100 5.107143 
27WESTBOUND  475 0.287879      64 6.256250 
27EASTBOUND  401 0.243030      59 6.458065 
27EASTBOUND  438 0.265455      46 7.049296 
27EASTBOUND  467 0.283030      58 6.500000 

    BPR_free_speed BPR_speed Volume time_normalised free_capacity 
      17.88 15.913662  580   1.593750   NaN 
      17.88 15.865198  588   2.041667   NaN 
      17.88 16.511613  475   0.666667   475.0 
      17.88 16.882837  401   1.091458   467.0 
      17.88 16.703004  438   1.479167   NaN 
      17.88 16.553928  467   0.960417   467.0 

は、しかし、私はまだid

で識別free_capacityの値を、属性を希望します

したがって、私は試しました:

ただし、この結果でもNaN値が発生します。 1.1 time_normalised条件は、アプリケーションを限定するものではなく、値を見つけるための条件です。あなたがtransformSeriesdf['id']によって条件によるフィルタリングのためのwhereを使用して、groupbyでき

id volume saturation time_delay_normalised  speed \ 
    27WESTBOUND  580 0.351515      57 6.542484 
    27WESTBOUND  588 0.356364     100 5.107143 
    27WESTBOUND  475 0.287879      64 6.256250 
    27EASTBOUND  401 0.243030      59 6.458065 
    27EASTBOUND  438 0.265455      46 7.049296 
    27EASTBOUND  467 0.283030      58 6.500000 

     BPR_free_speed BPR_speed Volume time_normalised free_capacity 
      17.88 15.913662  580   1.593750   475.0 
      17.88 15.865198  588   2.041667   475.0 
      17.88 16.511613  475   0.666667   475.0 
      17.88 16.882837  401   1.091458   467.0 
      17.88 16.703004  438   1.479167   467.0 
      17.88 16.553928  467   0.960417   467.0 
+1

[これ](http://stackoverflow.com/questions/11869910/pandas-filter-rows-of-dataframe-with-operator-chaining)が非常にあります同様の問題 - 基本的には、右側の最初のdf選択で時間正規化基準を連鎖させることになります。 –

+0

パンダインデックスが混乱を招くように削除しました。最初の3つのIDは '27WESTBOUND'で、最後の3つは' 27EASTBOUND'です。したがって、グループ化は、idごとのVolumeの最大値をtime_normalisedによって制限することを意図しています。これはもっと明確ですか? – LearningSlowly

答えて

3

望ましい結果

df['free_capacity'] = df['Volume'].where(df['time_normalised'] <= 1.1) 
            .groupby(df['id']) 
            .transform('max') 
print df 
      id volume saturation time_delay_normalised  speed \ 
0 27WESTBOUND  580 0.351515      57 6.542484 
1 27WESTBOUND  588 0.356364     100 5.107143 
2 27WESTBOUND  475 0.287879      64 6.256250 
3 27EASTBOUND  401 0.243030      59 6.458065 
4 27EASTBOUND  438 0.265455      46 7.049296 
5 27EASTBOUND  467 0.283030      58 6.500000 

    BPR_free_speed BPR_speed Volume time_normalised free_capacity 
0   17.88 15.913662  580   1.593750   475.0 
1   17.88 15.865198  588   2.041667   475.0 
2   17.88 16.511613  475   0.666667   475.0 
3   17.88 16.882837  401   1.091458   467.0 
4   17.88 16.703004  438   1.479167   467.0 
5   17.88 16.553928  467   0.960417   467.0 

新しい列Volume1を作成するために使用where場合、それは同じですあなたの基準による:

df['Volume1'] = df['Volume'].where(df['time_normalised'] <= 1.1) 
print df 
      id volume saturation time_delay_normalised  speed \ 
0 27WESTBOUND  580 0.351515      57 6.542484 
1 27WESTBOUND  588 0.356364     100 5.107143 
2 27WESTBOUND  475 0.287879      64 6.256250 
3 27EASTBOUND  401 0.243030      59 6.458065 
4 27EASTBOUND  438 0.265455      46 7.049296 
5 27EASTBOUND  467 0.283030      58 6.500000 

    BPR_free_speed BPR_speed Volume time_normalised Volume1 
0   17.88 15.913662  580   1.593750  NaN 
1   17.88 15.865198  588   2.041667  NaN 
2   17.88 16.511613  475   0.666667 475.0 
3   17.88 16.882837  401   1.091458 401.0 
4   17.88 16.703004  438   1.479167  NaN 
5   17.88 16.553928  467   0.960417 467.0 

新しい列Volume1transformで使用groupby

df['free_capacity'] = df.groupby('id')["Volume1"].transform('max') 
print df 
      id volume saturation time_delay_normalised  speed \ 
0 27WESTBOUND  580 0.351515      57 6.542484 
1 27WESTBOUND  588 0.356364     100 5.107143 
2 27WESTBOUND  475 0.287879      64 6.256250 
3 27EASTBOUND  401 0.243030      59 6.458065 
4 27EASTBOUND  438 0.265455      46 7.049296 
5 27EASTBOUND  467 0.283030      58 6.500000 

    BPR_free_speed BPR_speed Volume time_normalised Volume1 free_capacity 
0   17.88 15.913662  580   1.593750  NaN   475.0 
1   17.88 15.865198  588   2.041667  NaN   475.0 
2   17.88 16.511613  475   0.666667 475.0   475.0 
3   17.88 16.882837  401   1.091458 401.0   467.0 
4   17.88 16.703004  438   1.479167  NaN   467.0 
5   17.88 16.553928  467   0.960417 467.0   467.0 
+0

ありがとう、これは近いです!行がまだ必要なので、行を削除したくありません。最初のオプションは近いですが、私はまだ1.1より大きいtime_normalisedを持たない値に対して 'free_capacity'カラムを設定する必要があります。 free_capacityの値は、他のものから 'id'によって帰属されます。今あなたの提案を調整しようとしています... – LearningSlowly

+1

私は答えを編集します、それを確認してください。 – jezrael

1

、いくつかの答えが存在することができ、また、これを行うことができます。

   volume saturation time_delay_normalised  speed \ 
id 
27WESTBOUND  580 0.351515      57 6.542484 
27WESTBOUND  588 0.356364     100 5.107143 
27WESTBOUND  475 0.287879      64 6.256250 
27EASTBOUND  401 0.243030      59 6.458065 
27EASTBOUND  438 0.265455      46 7.049296 
27EASTBOUND  467 0.283030      58 6.500000 

      BPR_free_speed BPR_speed Volume time_normalised wrong_x free_capacity 
id 
27WESTBOUND   17.88 15.913662  580   1.593750 588 475 
27WESTBOUND   17.88 15.865198  588   2.041667 588 475 
27WESTBOUND   17.88 16.511613  475   0.666667 588 475 
27EASTBOUND   17.88 16.882837  401   1.091458 467 467 
27EASTBOUND   17.88 16.703004  438   1.479167 467 467 
27EASTBOUND   17.88 16.553928  467   0.960417 467 467 

df.set_index('id', inplace=True) 
df['free_capacity'] = df.groupby(level=0).apply(lambda x: x.loc[x['time_normalised']<=1.1]['volume'].max()) 

は、これは次のようなります

あなたが望むならインデックスをリセットすることができますdf.reset_index(inplace=True) wrong_x列には、最初に試したものです

df['wrong_x']=B.groupby(level=0)['volume'].max() 

を実行して、条件なしで、間違った結果です。

1

groupby().apply()も検討:

def maxtime(row): 
    row['free_capacity'] = row[row['time_normalised'] <= 1.1]['Volume'].max() 
    return row 

df = df.groupby('id').apply(maxtime) 
関連する問題