这是Pivot a dataframe with two columns as the index的后续问题。
我的数据采用以下格式:
Record ID Para Col2 Col3
1 A x a
1 A x b
2 B y a
2 B y b
1 A z c
1 C x a
我想重塑它:
Record Para a b c x y z
1 A 1 1 1 1 0 1
1 C 1 1 1 1 0 1
2 B 1 1 0 0 1 0
我试过
csv3 = csv2.pivot_table(index=['Record ID', 'Para'], columns=csv2.iloc[:,2:], aggfunc='size', fill_value=0).reset_index()
但不要让列正确。我需要做些什么不同的事情?
更新1:
我有10列。
答案 0 :(得分:1)
您可以汇总到set
,然后使用get_dummies
。
df2 = df.groupby(['RecordID', 'Para'])[df.columns[2:]].aggregate(set)
values = df2.apply(lambda x: set().union(*x.values), axis=1)
dummies = values.str.join('|').str.get_dummies()
res = dummies.reset_index()
print(res)
RecordID Para a b c x y z
0 1 A 1 1 1 1 0 1
1 2 B 1 1 0 0 1 0
答案 1 :(得分:1)
IIUC get_dummies
pd.get_dummies(df.set_index(['RecordID','Para']),prefix='',prefix_sep = '').sum(level=[0,1]).gt(0).astype(int)
Out[272]:
x y z a b c
RecordID Para
1 A 1 0 1 1 1 1
2 B 0 1 0 1 1 0
更新
pd.get_dummies(df.set_index(['RecordID','Para']),prefix='',prefix_sep = '').sum(level=[0,1]).gt(0).astype(int).replace(0,np.nan).groupby(level=0).ffill().fillna(0)
Out[292]:
x y z a b c
RecordID Para
1 A 1.0 0.0 1.0 1 1.0 1.0
2 B 0.0 1.0 0.0 1 1.0 0.0
1 C 1.0 0.0 1.0 1 1.0 1.0