从较大的数据帧创建旋转/融合数据帧的有效方法

时间:2018-02-25 17:59:06

标签: python performance pandas dataframe data-manipulation

我有一个数据框,其中包含大量列(~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()等函数,但我无法得到下面的确切设置。

1 个答案:

答案 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