我的数据如下:
A B C Month
0 1 3 5 Jan
1 1 2 3 Feb
我需要: a)将“月份”转换为假人
df2 = pd.get_dummies(df,columns=['Month'],drop_first=True,prefix = 'm')
b)将A / B / C与生成的所有虚拟变量相乘。 我能想到的唯一方法是
df_Feb = df2[['A','B','C']].multiply(df2['m_Feb], axis = "index")
df_March
...
,然后加入所有新创建的数据框,这不是很方便。有没有更好的方法来解决这个问题
答案 0 :(得分:1)
想法是由MultiIndex.from_product
和DataFrame.reindex
在MultiIndex
中同时创建DataFrame
的,因此可能会相互倍增:
df1 = df[['A','B','C']]
df2 = pd.get_dummies(df['Month'])
mux = pd.MultiIndex.from_product([df1.columns, df2.columns])
df2 = df2.reindex(mux, axis=1, level=1)
df1 = df1.reindex(mux, axis=1, level=0)
df = df1 * df2
最后的正确排序用于已排序的CategoricalIndex
,最后将数据列平整为f-string
:
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
df.columns = pd.MultiIndex.from_arrays([
df.columns.get_level_values(0),
pd.CategoricalIndex(df.columns.get_level_values(1),categories=months,ordered=True),
])
df = df.sort_index(axis=1)
df.columns = df.columns.map(lambda x: f'{x[0]}_{x[1]}')
print (df)
A_Jan A_Feb B_Jan B_Feb C_Jan C_Feb
0 1 0 3 0 5 0
1 0 1 0 2 0 3