【问题标题】:How to unpivot pandas dataframe to create datetime column如何取消透视熊猫数据框以创建日期时间列
【发布时间】:2019-08-26 21:55:02
【问题描述】:

我有一个旋转的 pandas 数据框,如下所示。 我需要将其还原为按日期时间索引的数据框,并且变量(列)减少到每个变量(列)中的一个。

我尝试使用 melt,但由于小时排,我正在努力重塑它。 重塑这样一个数据框的最佳选择是什么?

我拥有的数据框

+----------+------+------+------+------+------+
|   nan    | var1 | var1 | var2 | var2 | var3 |
+----------+------+------+------+------+------+
| Hour     |    2 |    3 |    0 |    2 |    0 |
| 1/1/2019 |  0.8 |  0.4 |  0.6 |  0.9 |  0.7 |
| 1/2/2019 |  0.2 |  0.2 |  0.7 |  0.3 |  0.1 |
| 1/3/2019 |  0.1 |  0.0 |  0.3 |  0.4 |  1.0 |
+----------+------+------+------+------+------+

我需要获取的数据框

+---------------+------+------+------+
|   Datetime    | var1 | var2 | var3 |
+---------------+------+------+------+
| 1/1/2019 0:00 | NaN  | 0.6  | 0.7  |
| 1/1/2019 1:00 | NaN  | NaN  | NaN  |
| 1/1/2019 2:00 | 0.8  | 0.9  | NaN  |
| 1/1/2019 3:00 | 0.4  | NaN  | NaN  |
| 1/2/2019 0:00 | NaN  | 0.7  | 0.1  |
| 1/2/2019 1:00 | NaN  | NaN  | NaN  |
| 1/2/2019 2:00 | 0.2  | 0.3  | NaN  |
| 1/2/2019 3:00 | 0.2  | NaN  | NaN  |
| 1/3/2019 0:00 | NaN  | 0.3  | 1.0  |
| 1/3/2019 1:00 | NaN  | NaN  | NaN  |
| 1/3/2019 2:00 | 0.1  | 0.4  | NaN  |
| 1/3/2019 3:00 | 0.0  | NaN  | NaN  |
+---------------+------+------+------+

【问题讨论】:

    标签: python pandas dataframe pivot melt


    【解决方案1】:

    这是一个非常糟糕的答案,它是单一的 pandas,但考虑到您以您呈现的格式呈现的数据,可以完成工作。如果您有大量数据,我强烈建议您找到更优化的方法。

    dff = df.copy()
    
    mn, mx = df.loc['Hour'].agg([min, max]).astype(int)
    
    df = df.loc[df.index.repeat(mx-mn+1)]
    df = df.loc[df.index != 'Hour']
    df = df.assign(time=list(range(mn,mx+1))*(mx-mn))
    df = df.set_index('time', append=True).iloc[:,:0]
    
    for i,v in enumerate(dff.columns):
        d = dff.iloc[:, i].to_frame()
        hour = d.at['Hour', v]
        for idx, row in d.iloc[1:].iterrows():
            df.loc[(idx, hour), v] = row[v]
    
    df = df.reset_index().rename(columns={0: 'date'})
    df['datetime'] = df[['date', 'time']].apply(lambda x: f"{x['date']} {x['time']}:00", axis=1)
    df = df.drop(columns=['date', 'time']).set_index('datetime').reset_index()
    
    print(df)
    
             datetime   v1   v2   v3
    0   1/1/2019 0:00  NaN  0.6  0.7
    1   1/1/2019 1:00  NaN  NaN  NaN
    2   1/1/2019 2:00  0.8  0.9  NaN
    3   1/1/2019 3:00  0.4  NaN  NaN     
    4   1/2/2019 0:00  NaN  0.7  0.1
    5   1/2/2019 1:00  NaN  NaN  NaN
    6   1/2/2019 2:00  0.2  0.3  NaN
    7   1/2/2019 3:00  0.2  NaN  NaN
    8   1/3/2019 0:00  NaN  0.3  1.0
    9   1/3/2019 1:00  NaN  NaN  NaN
    10  1/3/2019 2:00  0.1  0.4  NaN
    11  1/3/2019 3:00  0.0  NaN  NaN
    

    【讨论】:

      猜你喜欢
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 2020-03-21
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      相关资源
      最近更新 更多