python - 如何旋转熊猫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 与大多数示例的格式大不相同。
解决方案
获得您想要的东西的一种方法是:
用于
.set_index('DATE')
将DATE
列转换为索引。也用于
.stack()
将列引入索引,创建一个MultiIndex
每个日期的行作为索引中的第二级插入的位置。用于
.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
推荐阅读
- python - 如何从 python 的列中删除独立的字母?
- javascript - 使用设置属性 (DOM) 更改操作值
- java - Java FIFO的云扳手库的会话池?
- flutter - Flutter:块不从列表中删除数据
- python - 从多嵌套字典打印特定值
- docker - 在 dockerfile 中执行一个简单的 go .exe
- python - 在多个值中寻找价值
- javascript - API 包含 JSON 数据如何在 HTML 和 JavaScript 上呈现?
- atlassian-sourcetree - 完成发布期间的 Sourcetree 致命错误 - 致命:无法读取“https://github.com”的用户名:未配置设备
- dialogflow-es - Google Assistant 上的用户位置(纬度和经度)没有快速更新