2017-12-21 11 views
-1

Python/Pandasを使用する異なる行の値に条件付きの2つの新しい列()を作成して、列ID3)が、同じ群(ID1によって決定される)内からである。各ID1グループについて Python Pandas:データフレームのグループ内の異なる行の値を持つ新しい列を反復的に作成する

は、私は ID331に等しい ID2値を取り、 1または 2ID3上の条件付き Aと呼ばれる新しい列にこの値を載せていきたいと思います。同様に、の値をとし、 41とし、この値を Bという新しい列に入れて、 ID3を条件として 1または 2とします。

私は次の形式でデータフレームを持っていると仮定すると:

import pandas as pd 

df = pd.DataFrame({'ID1': (1, 1, 1, 1, 2, 2, 2), 'ID2': (151, 152, 153, 154, 261, 262, 263), 'ID3': (1, 2, 31, 41, 1, 2, 41), 'ID4': (2, 2, 1, 2, 1, 1, 2)}) 
print(df) 

    ID1 ID2 ID3 ID4 
0 1 151 1 2 
1 1 152 2 2 
2 1 153 31 1 
3 1 154 41 2 
4 2 261 1 1 
5 2 262 2 1 
6 2 263 41 2 

変換後のフォーマットを以下に示しているもののようになります。 ABの列には、ID2の値が入力され、条件付き値はID3に設定されます。

ID1 ID2 ID3 ID4 A B 
0 1 151 1 2 153 154 
1 1 152 2 2 153 154 
2 1 153 31 1 
3 1 154 41 2 
4 2 261 1 1 
5 2 262 2 1   263 
6 2 263 41 2   263 

私は以下のものを使用しようとしましたが、変換は元のデータセットと同じ数の値を保持します。これは、ID3 = 31または41の行には問題があります。また、グループ内に31の値がない場合は、デフォルトでID2の値を返します。

df['A'] = df.groupby('ID1')['ID2'].transform(lambda x: x.loc[df['ID3'] == 31]) 
df['B'] = df.groupby('ID1')['ID2'].transform(lambda x: x.loc[df['ID3'] == 41]) 

結果:

ID1 ID2 ID3 ID4 A B 
0 1 151 1 2 153 154 
1 1 152 2 2 153 154 
2 1 153 31 1 153 154 
3 1 154 41 2 153 154 
4 2 261 1 1 261 263 
5 2 262 2 1 262 263 
6 2 263 41 2 263 263 

任意の提案ですか?前もって感謝します!

答えて

0

私はこれが最良の解決策だとは思わないのですが、その解決策です。

.loc.whereに置き換えることができます。これは、条件が真でない場合は、NaNを返します。その後埋め戻しNaNし、再度これがうまく機能1または2

df['A'] = df.groupby('ID1')['ID2'].transform(lambda x: 
     x.where(df.ID3==31).fillna(method='bfill').where(df.ID3.isin([1,2]))) 

df['B'] = df.groupby('ID1')['ID2'].transform(lambda x: 
     x.where(df.ID3==41).fillna(method='bfill').where(df.ID3.isin([1,2]))) 

    ID1 ID2 ID3 ID4  A  B 
0 1 151 1 2 153.0 154.0 
1 1 152 2 2 153.0 154.0 
2 1 153 31 1 NaN NaN 
3 1 154 41 2 NaN NaN 
4 2 261 1 1 NaN 263.0 
5 2 262 2 1 NaN 263.0 
6 2 263 41 2 NaN NaN 
+0

ID3.whereでフィルタ!役に立つフィードバックをありがとう。コードでは、データフレームを 'ID1'でソートし、バックフィルですべての値を' NaN'で置き換えないようにする 'ID3'が必要です。どうもありがとう! – Beskimo

関連する問題