-1
Python/Pandasを使用する異なる行の値に条件付きの2つの新しい列()を作成して、列ID3
)が、同じ群(ID1
によって決定される)内からである。各ID1
グループについて Python Pandas:データフレームのグループ内の異なる行の値を持つ新しい列を反復的に作成する
ID3
が
31
に等しい
ID2
値を取り、
1
または
2
さ
ID3
上の条件付き
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
変換後のフォーマットを以下に示しているもののようになります。 A
とB
の列には、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
任意の提案ですか?前もって感謝します!
さ
ID3
に.where
でフィルタ!役に立つフィードバックをありがとう。コードでは、データフレームを 'ID1'でソートし、バックフィルですべての値を' NaN'で置き換えないようにする 'ID3'が必要です。どうもありがとう! – Beskimo