扩展熊猫数据框并合并列

时间:2020-09-14 02:51:25

标签: python pandas

我有一个看起来像这样的数据框:

    desc    item    type1    date1    type2    date2    type3    date3
0   this    foo1      A        9/1      B        9/2      C        9/3
1   this    foo2      D        9/4      E        9/5      F        9/6

如何使它看起来像这样:

     desc    item    type    date
0    this    foo1      A      9/1
1    this    foo1      B      9/2
2    this    foo1      C      9/3
3    this    foo2      D      9/4
4    this    foo2      E      9/5
5    this    foo2      F      9/6

2 个答案:

答案 0 :(得分:5)

使用wide_to_long

进行检查
out = pd.wide_to_long(df.reset_index(), ['type','date'], i ='index', j = 'drop').reset_index(drop=True)
out
Out[127]: 
  type date
0    A  9/1
1    B  9/2
2    C  9/3

对于您更新的问题,相同的概念仍然适用,因为item是唯一的,因此您无需重置索引:

pd.wide_to_long(df, stubnames=['type','date'], i='item',j='drop').droplevel(-1).reset_index()



    item  type  date
0   foo1    A   9/1
1   foo2    D   9/4
2   foo1    B   9/2
3   foo2    E   9/5
4   foo1    C   9/3
5   foo2    F   9/6

答案 1 :(得分:1)

如果列包含.meltvalue_vars,也可以通过列表理解将列表传递到type,从而在两个数据帧上使用date。然后,您可以在索引上合并这两个数据框:

df = pd.merge(df.melt(id_vars='item', value_vars=[col for col in df.columns if 'type' in col], value_name='type')[['item','type']],
              df.melt(id_vars='item', value_vars=[col for col in df.columns if 'date' in col], value_name='date')['date'],
              how='left', left_index=True, right_index=True).sort_values('type')
df
Out[1]: 
   item type date
0  foo1    A  9/1
2  foo1    B  9/2
4  foo1    C  9/3
1  foo2    D  9/4
3  foo2    E  9/5
5  foo2    F  9/6