我有一个看起来像这样的数据框:
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
?
答案 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)
如果列包含.melt
或value_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