簡體   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