pandas get_dummies() 对于具有预定义列表的多列
pandas get_dummies() for multiple columns with a pre-defined list
我正在努力为我的数据框创建虚拟列。
这是我的原始数据框:
df = pd.DataFrame({'id': ['01', '02', '03'],
'Q1': ['a', 'b', 'a'],
'Q2': ['c', 'b', 'a']})
print(df)
id Q1 Q2
0 01 a c
1 02 b b
2 03 a a
我有 Q1 和 Q2 的预定义答案列表:
ls = list("abc")
print(ls)
['a', 'b', 'c']
我预期的数据框结构:
id Q1_a Q1_b Q1_c Q2_a Q2_b Q2_c
0 01 1 0 0 0 0 1
1 02 0 1 0 0 1 0
2 03 1 0 0 1 0 0
请帮忙!谢谢!
尝试:
df = pd.DataFrame(
{"id": ["01", "02", "03"], "Q1": ["a", "b", "a"], "Q2": ["c", "b", "a"]}
)
ls = list("abc")
idx = pd.MultiIndex.from_product([df.loc[:, "Q1":], ls])
x = pd.concat(
{c: pd.get_dummies(df[c]) for c in df.loc[:, "Q1":]}, axis=1
).reindex(columns=idx, fill_value=0)
x.columns = x.columns.map("_".join)
print(pd.concat([df["id"], x], axis=1))
打印:
id Q1_a Q1_b Q1_c Q2_a Q2_b Q2_c
0 01 1 0 0 0 0 1
1 02 0 1 0 0 1 0
2 03 1 0 0 1 0 0
基于 post ,这是一个答案:
df2 = pd.get_dummies(df[['Q1', 'Q2']].astype(pd.CategoricalDtype(categories=ls)))
df2.insert(0, 'id', df['id'])
输出:
df2
id Q1_a Q1_b Q1_c Q2_a Q2_b Q2_c
0 01 1 0 0 0 0 1
1 02 0 1 0 0 1 0
2 03 1 0 0 1 0 0
我正在努力为我的数据框创建虚拟列。
这是我的原始数据框:
df = pd.DataFrame({'id': ['01', '02', '03'],
'Q1': ['a', 'b', 'a'],
'Q2': ['c', 'b', 'a']})
print(df)
id Q1 Q2
0 01 a c
1 02 b b
2 03 a a
我有 Q1 和 Q2 的预定义答案列表:
ls = list("abc")
print(ls)
['a', 'b', 'c']
我预期的数据框结构:
id Q1_a Q1_b Q1_c Q2_a Q2_b Q2_c
0 01 1 0 0 0 0 1
1 02 0 1 0 0 1 0
2 03 1 0 0 1 0 0
请帮忙!谢谢!
尝试:
df = pd.DataFrame(
{"id": ["01", "02", "03"], "Q1": ["a", "b", "a"], "Q2": ["c", "b", "a"]}
)
ls = list("abc")
idx = pd.MultiIndex.from_product([df.loc[:, "Q1":], ls])
x = pd.concat(
{c: pd.get_dummies(df[c]) for c in df.loc[:, "Q1":]}, axis=1
).reindex(columns=idx, fill_value=0)
x.columns = x.columns.map("_".join)
print(pd.concat([df["id"], x], axis=1))
打印:
id Q1_a Q1_b Q1_c Q2_a Q2_b Q2_c
0 01 1 0 0 0 0 1
1 02 0 1 0 0 1 0
2 03 1 0 0 1 0 0
基于 post
df2 = pd.get_dummies(df[['Q1', 'Q2']].astype(pd.CategoricalDtype(categories=ls)))
df2.insert(0, 'id', df['id'])
输出:
df2
id Q1_a Q1_b Q1_c Q2_a Q2_b Q2_c
0 01 1 0 0 0 0 1
1 02 0 1 0 0 1 0
2 03 1 0 0 1 0 0