繁体   English   中英

如何取消透视熊猫数据框以创建日期时间列

[英]How to unpivot pandas dataframe to create datetime column

我有一个透视的pandas数据框,如下图所示。 我需要将其取消透视成按日期时间索引的数据帧,并且变量(列)减少为每个。

我尝试使用熔体,但由于时间紧迫,我正在努力重塑它。 重塑此类数据框的最佳选择是什么?

我拥有的数据框

+----------+------+------+------+------+------+
|   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  |
+---------------+------+------+------+

这是一个单调的大熊猫,真是一个很糟糕的答案,但是给定的数据以您呈现的格式呈现就可以完成工作。如果您有大量的数据,我强烈建议您找到一种更优化的方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM