【问题标题】:Efficient method to create pivoted/melted dataframes from larger dataframe从较大的数据帧创建旋转/融合数据帧的有效方法
【发布时间】:2018-02-25 17:59:05
【问题描述】:

我有一个数据框,其中包含大量列 (~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

在上面的示例中,我显示了站点名称和相关的邮政编码。我的数据框有许多这样的列,它们以顺序方式相关,取决于在记录日期活动的“站点”,基础数据可能会发生变化(例如,我已经显示 Site1 下降 - 变为不活动 - 稍后被替换按站点3)

我希望将上述数据框转换为:

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() 之类的函数,但我无法得出下面的确切设置。

【问题讨论】:

    标签: python performance pandas dataframe data-manipulation


    【解决方案1】:

    IIUCwide_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
    

    【讨论】:

    • @wingsoficarus116 yw ~ :-) 快乐编码
    猜你喜欢
    • 2020-06-29
    • 1970-01-01
    • 2022-05-21
    • 2018-05-24
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    相关资源
    最近更新 更多