python pandas基于标记/列值的数据帧转换

时间:2017-01-12 22:51:21

标签: python pandas

我有以下两个pandas数据帧

df1=
           selected0 selected1
2017-01-01  product1  product2
2017-01-02  product1  product2
2017-01-03  product3  product4

df2 = 
            selected0 selected1
2017-01-01       0.2       0.3
2017-01-02       0.3       0.4
2017-01-03       0.5       0.6

现在我想将这两个数据帧转换为一个类似于以下

的数据帧
             product1 product2 product3 product4
2017-01-01      0.2      0.3      NaN      NaN
2017-01-02      0.3      0.4      NaN      NaN
2017-01-03      NaN      NaN      0.5      0.6

是否有更多pythonic方式可以在不绕过数据帧中的每一行的情况下执行此操作?非常感谢你

2 个答案:

答案 0 :(得分:1)

您可以将两个数据帧转换为长格式,然后根据日期合并并选择*,然后将结果转换回宽格式:

(df1.stack().to_frame("Product")               # reshape df1 to long format
    .join(df2.stack().rename("Value"))         # reshape df2 to long format and join with df1
    .reset_index(level = 1, drop = True)       # drop the original column names
    .pivot(columns="Product", values="Value")) # reshape to wide format

enter image description here

答案 1 :(得分:1)

使用可怕的循环

df3 = pd.DataFrame(index=df1.index, columns=np.unique(df1.values))

for (d, c), v in df2.stack().iteritems():
    df3.set_value(d, df1.get_value(d, c), v)

df3

enter image description here