首页 > 解决方案 > 如何旋转熊猫df,其中每个列标题是一个小时,每行是一个日期

问题描述

所以我有一个看起来像这样的熊猫df 在此处输入图像描述

其中每一列是日期列中注明的一天中的一个小时。我想旋转这个df,所以一天中的每个小时都是它自己的行。与此类似

在此处输入图像描述

每个日期的每小时将有 24 行。

我尝试使用以下方法使用 pd.melt

hourly_value = ['00:00','01:00','02:00','03:00','04:00','05:00','06:00','07:00','08:00','09:00','10:00','11:00','12:00']
df = df.melt(id_vars = ['DATE'], var_name = hourly_value, value_name = ('Hourly Precip'))

但不断收到错误“IndexError: Too many levels: Index has only 1 level, not 2”。我也研究过使用 df.pivot 但我开始认为我的 df 与大多数示例的格式大不相同。

标签: pythonpandas

解决方案


获得您想要的东西的一种方法是:

  1. 用于.set_index('DATE')DATE列转换为索引。

  2. 也用于.stack()将列引入索引,创建一个MultiIndex每个日期的行作为索引中的第二级插入的位置。

  3. 用于.reset_index()将所有索引级别转回行。

以下片段说明:

import numpy as np
import pandas as pd

dates = [f"1/{i}/2020" for i in range(1, 21)]
cols = ["DATE"] + [str(i) + ":00" for i in range(25)]
zeros = np.zeros((len(dates), len(cols) - 1))
data = list([[x] + list(y) for x, y in zip(dates, zeros)])

df = pd.DataFrame(data=data, columns=cols)

df2 = (
    df.set_index("DATE") # makes the DATE column the index
    .stack()             # stacks 
    .reset_index()
    .rename(columns={"level_1": "Time", 0: "Value"})
)
print(df2.head())

哪个输出:

       DATE  Time  Value
0  1/1/2020  0:00    0.0
1  1/1/2020  1:00    0.0
2  1/1/2020  2:00    0.0
3  1/1/2020  3:00    0.0
4  1/1/2020  4:00    0.0

推荐阅读