python - 如何重新排列 python pandas 数据框?

标签 python row pandas sequence dataframe

我从 .csv 文件中读取了以下数据框,其中“日期”列是索引。天在行中,列显示当天小时的值。

> Date           h1 h2  h3  h4 ... h24
> 14.03.2013    60  50  52  49 ... 73

我想这样安排,以便有一个包含日期/时间的索引列和一个包含序列中的值的列

>Date/Time            Value
>14.03.2013 00:00:00  60
>14.03.2013 01:00:00  50
>14.03.2013 02:00:00  52
>14.03.2013 03:00:00  49
>.
>.
>.
>14.03.2013 23:00:00  73

我尝试使用两个循环遍历数据帧。 在 Pandas 中有更简单的方法吗?

最佳答案

我不是最擅长日期操作的人,但也许是这样的:

import pandas as pd
from datetime import timedelta

df = pd.read_csv("hourmelt.csv", sep=r"\s+")

df = pd.melt(df, id_vars=["Date"])
df = df.rename(columns={'variable': 'hour'})
df['hour'] = df['hour'].apply(lambda x: int(x.lstrip('h'))-1)

combined = df.apply(lambda x: 
                    pd.to_datetime(x['Date'], dayfirst=True) + 
                    timedelta(hours=int(x['hour'])), axis=1)

df['Date'] = combined
del df['hour']

df = df.sort("Date")

下面是一些解释。

开始于

>>> import pandas as pd
>>> from datetime import datetime, timedelta
>>> 
>>> df = pd.read_csv("hourmelt.csv", sep=r"\s+")
>>> df
         Date  h1  h2  h3  h4  h24
0  14.03.2013  60  50  52  49   73
1  14.04.2013   5   6   7   8    9

我们可以使用 pd.melt 将小时列合并为具有该值的一列:

>>> df = pd.melt(df, id_vars=["Date"])
>>> df = df.rename(columns={'variable': 'hour'})
>>> df
         Date hour  value
0  14.03.2013   h1     60
1  14.04.2013   h1      5
2  14.03.2013   h2     50
3  14.04.2013   h2      6
4  14.03.2013   h3     52
5  14.04.2013   h3      7
6  14.03.2013   h4     49
7  14.04.2013   h4      8
8  14.03.2013  h24     73
9  14.04.2013  h24      9

去掉那些h:

>>> df['hour'] = df['hour'].apply(lambda x: int(x.lstrip('h'))-1)
>>> df
         Date  hour  value
0  14.03.2013     0     60
1  14.04.2013     0      5
2  14.03.2013     1     50
3  14.04.2013     1      6
4  14.03.2013     2     52
5  14.04.2013     2      7
6  14.03.2013     3     49
7  14.04.2013     3      8
8  14.03.2013    23     73
9  14.04.2013    23      9

将两列合并为一个日期:

>>> combined = df.apply(lambda x: pd.to_datetime(x['Date'], dayfirst=True) + timedelta(hours=int(x['hour'])), axis=1)
>>> combined
0    2013-03-14 00:00:00
1    2013-04-14 00:00:00
2    2013-03-14 01:00:00
3    2013-04-14 01:00:00
4    2013-03-14 02:00:00
5    2013-04-14 02:00:00
6    2013-03-14 03:00:00
7    2013-04-14 03:00:00
8    2013-03-14 23:00:00
9    2013-04-14 23:00:00

重新组装并清理:

>>> df['Date'] = combined
>>> del df['hour']
>>> df = df.sort("Date")
>>> df
                 Date  value
0 2013-03-14 00:00:00     60
2 2013-03-14 01:00:00     50
4 2013-03-14 02:00:00     52
6 2013-03-14 03:00:00     49
8 2013-03-14 23:00:00     73
1 2013-04-14 00:00:00      5
3 2013-04-14 01:00:00      6
5 2013-04-14 02:00:00      7
7 2013-04-14 03:00:00      8
9 2013-04-14 23:00:00      9

关于python - 如何重新排列 python pandas 数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15432659/

相关文章:

python - 为什么搜索查询表显示表头,而不是 BeautifulSoup (Python) 中的数据?

python - 无法在 macOS 上的 Anaconda3 python3.6 上安装 OpenCV3

python - 如何生成更多字符?

c++ - cmake 链接 libboost_python-py32.so 而不是 libboost_python.so

php - 单击每行中的按钮时,如何更新显示 sql 数据的 html 表行?

python - 值错误 : Unknown label type: 'unknown' when plotting SVM classifiers in the iris dataset

python - 看起来相似的 Python for 循环之间的区别?

jquery - 如何使用 Jquery 复制表的第一行?

Python 列表推导式、子列表行和列

python - 从另一个数据帧更新数据帧不起作用