gpt4 book ai didi

python - 填充DataFrame,缺失数据

转载 作者:行者123 更新时间:2023-12-01 02:54:06 27 4
gpt4 key购买 nike

描述

我读取了一个包含三列的表:ID、时间和位置来创建数据帧。 ID 是第一个索引,时间是第二个索引。我希望时间频率为五分钟,如果对应时间没有数据,则将位置设置为最后一个位置(见下表)。

现在的数据框

ID   time          place
001 00:00:00 1
00:15:00 3
002 00:05:00 2

我希望得到的数据框

ID   time          place
001 00:00:00 1
00:05:00 1
00:10:00 1
00:15:00 3
#continue to fill the table until 23:55:00

002 00:00:00 2
00:05:00 2
#continue to fill the table until 23:55:00

代码

def create_table(n):
table = pd.read_table(n,sep='\x01', header=None, names=['ID','time','place'])
table['time'] = pd.to_datetime(table['time'], format='%H:%M:%S')
table = table.set_index('ID','time')
return table

我不知道如何继续制作理想的数据框。有人能给我一些提示吗?非常感谢!!

最佳答案

要获取上面定义的 DataFrame,我们可以这样做:

df = pd.DataFrame({'ID': ['001', '001', '002'], 'time': ['00:00:00', '00:15:00', '00:05:00'], 'place': [1, 3, 2]}).set_index(['ID', 'time'])

为了能够只处理时间并对每个 ID 值应用相同的操作,让我们取消堆叠“ID”,以便我们拥有一个列的多重索引,其中 ID 位于顶层:

In [91]: df = df.unstack(0)

In [92]: df
Out[92]:
place
ID 001 002
time
00:00:00 1.0 NaN
00:05:00 NaN 2.0
00:15:00 3.0 NaN

现在,让我们将索引(现在只是“时间”)转换为 DatetimeIndex:

In [93]: df.index = pd.to_datetime(df.index)

In [94]: df
Out[94]:
place
ID 001 002
time
2017-06-06 00:00:00 1.0 NaN
2017-06-06 00:05:00 NaN 2.0
2017-06-06 00:15:00 3.0 NaN

这会添加今天的日期,但我们可以稍后删除它。

接下来,让我们创建另一个 DatetimeIndex,其中包含今天日期的 5 分钟增量:

In [95]: times = pd.date_range("00:00:00", "23:55:00", freq="5min")

In [96]: times
Out[96]:
DatetimeIndex(['2017-06-06 00:00:00', '2017-06-06 00:05:00',
'2017-06-06 00:10:00', '2017-06-06 00:15:00',
'2017-06-06 00:20:00', '2017-06-06 00:25:00',
'2017-06-06 00:30:00', '2017-06-06 00:35:00',
'2017-06-06 00:40:00', '2017-06-06 00:45:00',
...
'2017-06-06 23:10:00', '2017-06-06 23:15:00',
'2017-06-06 23:20:00', '2017-06-06 23:25:00',
'2017-06-06 23:30:00', '2017-06-06 23:35:00',
'2017-06-06 23:40:00', '2017-06-06 23:45:00',
'2017-06-06 23:50:00', '2017-06-06 23:55:00'],
dtype='datetime64[ns]', length=288, freq='5T')

让我们根据这个新的 DatetimeIndex 重新索引 df 的索引:

In [97]: df = df.reindex(times)

In [98]: df
Out[98]:
place
ID 001 002
2017-06-06 00:00:00 1.0 NaN
2017-06-06 00:05:00 NaN 2.0
2017-06-06 00:10:00 NaN NaN
2017-06-06 00:15:00 3.0 NaN
2017-06-06 00:20:00 NaN NaN
...

现在我们只需要前向填充,以便每次该位置都是最后一个非 NaN 位置:

In [99]: df = df.ffill()

In [100]: df
Out[100]:
place
ID 001 002
2017-06-06 00:00:00 1.0 NaN
2017-06-06 00:05:00 1.0 2.0
2017-06-06 00:10:00 1.0 2.0
2017-06-06 00:15:00 3.0 2.0
2017-06-06 00:20:00 3.0 2.0
2017-06-06 00:25:00 3.0 2.0
2017-06-06 00:30:00 3.0 2.0
...

从这里开始,我们需要去掉日期:

In [101]: df.index = df.index.strftime('%H:%M:%S')

In [102]: df
Out[102]:
place
ID 001 002
00:00:00 1.0 NaN
00:05:00 1.0 2.0
00:10:00 1.0 2.0
00:15:00 3.0 2.0
00:20:00 3.0 2.0
00:25:00 3.0 2.0
...

我们在“时间”索引上丢失了名称,所以让我们把它放回去:

df.index = df.index.set_names('time')

最后,将“ID”放回到索引中:

In [103]: df.stack(1).swaplevel(0, 1)
Out[103]:
place
ID time
001 00:00:00 1.0
00:05:00 1.0
002 00:05:00 2.0
001 00:10:00 1.0
002 00:10:00 2.0
001 00:15:00 3.0
...

关于python - 填充DataFrame,缺失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44396120/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com