如何重新排列python数据帧?
我从一个.csv文件中读取了以下数据帧,其中“日期”列是索引。日期在行中,列显示当天小时的值如何重新排列python数据帧?,python,row,pandas,sequence,dataframe,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.
> 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
我尝试使用两个循环遍历数据帧。
在熊猫身上有更简单的方法吗?我不擅长约会,但可能是这样的:
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
s:
>>> 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
您可以随时获取每小时的数据并将其展平。您将生成一个新的DatetimeIndex和hourly freq
df = df.asfreq('D')
hourly_data = df.values[:, :]
new_ind = pd.date_range(start=df.index[0], freq="H", periods=len(df) * 24)
# create Series.
s = pd.Series(hourly_data.flatten(), index=new_ind)
我假设read_csv正在解析“Date”列并将其作为索引。我们将频率更改为“D”,这样,如果您缺少天数,新的索引将正确排列。缺少的天数将用np.nan
填充,您可以使用s.dropna()
删除这些天数
很好的解决方案!您可以将
df['hour'].apply(…)
和combined=…
行组合成df['Date']+=df['hour'].apply(lambda x:timedelta(hours=int(x.lstrip('h')-1))
。很好的解决方案。谢谢。我刚刚将日期设置为索引,它工作得非常完美。>df=df.set_索引(“日期”)