私がそのようなパンダのデータフレームを持っている場合:
colA colB
A A1
B C1
A B1
B A1
colAには2つの一意の値(A、B)があり、colBには3つの一意の値(A1、B1、およびC1)があります。
colAとcolBがすべての組み合わせであり、以前のdfに存在する組み合わせに基づいて1または0である別の列colCである新しいデータフレームを作成したいと思います。
期待される結果:
colA colB colC
A A1 1
A B1 1
A C1 0
B A1 1
B B1 0
B C1 1
最初に、でDataFrame.assign
埋めて新しい列を作成し1
、次に両方の列の値で作成MultiIndex.from_product
しSeries.unique
、DataFrame.set_index
使用後にDataFrame.reindex
-パラメータcolC
によって列に新しく追加された行に値を設定することができfill_value
ます。
mux = pd.MultiIndex.from_product([df['colA'].unique(),
df['colB'].unique()], names=['colA','colB'])
df1 = df.assign(colC = 1).set_index(['colA','colB']).reindex(mux, fill_value=0).reset_index()
print (df1)
colA colB colC
0 A A1 1
1 A C1 0
2 A B1 1
3 B A1 1
4 B C1 1
5 B B1 0
代替による使用のリシェイプありDataFrame.set_index
、Series.unstack
そしてDataFrame.stack
:
df1 = (df.assign(colC = 1)
.set_index(['colA','colB'])['colC']
.unstack(fill_value=0)
.stack()
.reset_index(name='ColC'))
print (df1)
colA colB ColC
0 A A1 1
1 A B1 1
2 A C1 0
3 B A1 1
4 B B1 0
5 B C1 1
別の解決策は、新規作成であるDataFrame
ことでitertools.product
、DataFrame.merge
とindicator=True
で比較することにより、リネーム列とセットboth
とするために、整数にキャストTrue/False
へ1/0
のマッピング:
from itertools import product
df1 = pd.DataFrame(product(df['colA'].unique(), df['colB'].unique()), columns=['colA','colB'])
df = df1.merge(df, how='left', indicator=True).rename(columns={'_merge':'colC'})
df['colC'] = df['colC'].eq('both').astype(int)
print (df)
colA colB colC
0 A A1 1
1 A C1 0
2 A B1 1
3 B A1 1
4 B C1 1
5 B B1 0
最後に、必要に応じて、両方の列による並べ替えを追加しますDataFrame.sort_values
。
df1 = df1.sort_values(['colA','colB'])
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加