熊猫中具有多列的多列

时间:2020-02-26 12:26:59

标签: python pandas

我的数据如下:

   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
...

,然后加入所有新创建的数据框,这不是很方便。有没有更好的方法来解决这个问题

1 个答案:

答案 0 :(得分:1)

想法是由MultiIndex.from_productDataFrame.reindexMultiIndex中同时创建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