我有一个数据框,其中包含大量列(~36K),其中许多列都是某些分类信息的重复。
从这个更大的数据框架中,我想构建一个基本的关系数据帧集。
我已经列出了我希望的操作类型。
Master df
ID record_date Site Site1 Site2 Zip Zip1 Zip2
1 12-01-1990 Site0 Site1 Site2 Zip0 Zip1 Zip2
1 12-12-1990 Site0 Site2 N/A Zip0 Zip2 N/A
1 01-15-1991 Site0 Site2 Site3 Zip0 Zip2 Zip3
在上面的示例中,我显示了站点名称和相关的zipcodes。我的数据框有许多这样的列以顺序方式相关,其中取决于在record_date处活动的“站点”基础数据可能会发生变化(例如,我已经显示Site1丢弃 - 变为非活动状态 - 以后再被替换by site3)
我希望将上述数据框转换为:
Transformed df
ID record_date Site Zip
1 12-01-1990 Site0 Zip0
1 12-01-1990 Site1 Zip1
1 12-01-1990 Site2 Zip2
1 12-12-1990 Site0 Zip0
1 12-12-1990 Site2 Zip2
1 01-15-1991 Site0 Zip0
1 01-15-1991 Site2 Zip2
1 01-15-1991 Site3 Zip3
由于我必须进行相当多的转换,因此效率是关键。我相信我可以使用pd.melt()或pd.pivot_table()等函数,但我无法得到下面的确切设置。
答案 0 :(得分:2)
IIUC wide_to_long
df=df.rename(columns={'Site':'Site0','Zip':'Zip0'})
pd.wide_to_long(df.reset_index(),['Site','Zip'],i='index',j='Drop',sep='').dropna(0).sort_index().reset_index(drop=True)
Out[330]:
ID record_date Site Zip
0 1 12-01-1990 Site0 Zip0
1 1 12-01-1990 Site1 Zip1
2 1 12-01-1990 Site2 Zip2
3 1 12-12-1990 Site0 Zip0
4 1 12-12-1990 Site2 Zip2
5 1 01-15-1991 Site0 Zip0
6 1 01-15-1991 Site2 Zip2
7 1 01-15-1991 Site3 Zip3