Pandas 使用日期列填充缺少的行
我有一个像这样传入的数据帧。我真的不知道有多少不同的ts周期。因此,我想找到ts的最小值和最大值,然后将不包含所有ts(每日)的行扩展为零,填充visit列,同时复制其余字段Pandas 使用日期列填充缺少的行,pandas,Pandas,我有一个像这样传入的数据帧。我真的不知道有多少不同的ts周期。因此,我想找到ts的最小值和最大值,然后将不包含所有ts(每日)的行扩展为零,填充visit列,同时复制其余字段 uuid site ts visit 0 +CW99 1124 2013-06-24 2 1 +CW99 1124 2013-06-26 1 2 +CW99 1124 2013-06-27 1 3 +CW99 1124 2013-06-20
uuid site ts visit
0 +CW99 1124 2013-06-24 2
1 +CW99 1124 2013-06-26 1
2 +CW99 1124 2013-06-27 1
3 +CW99 1124 2013-06-20 1
4 +CW99 1124 2013-06-21 1
5 +CW99 1124 2013-06-24 2
6 +CW9W 956 2013-06-21 4
7 +CW9W 956 2013-06-22 2
8 +CW9W 956 2013-06-23 3
9 +CW9W 956 2013-06-24 4
谢谢。这不是小事。我将在下面解释原因 预对齐,读取原始数据帧,并确保
ts
列的数据类型为datetime64[ns]
uuid site ts visit
0 +CW99 1124 2013-06-20 1
1 +CW99 1124 2013-06-21 1
2 +CW99 1124 2013-06-22 1
3 +CW99 1124 2013-06-23 0
4 +CW99 1124 2013-06-24 2
5 +CW99 1124 2013-06-25 0
6 +CW99 1124 2013-06-26 1
7 +CW99 1124 2013-06-27 1
8 +CW9W 956 2013-06-20 0
9 +CW9W 956 2013-06-21 4
10 +CW9W 956 2013-06-22 2
11 +CW9W 956 2013-06-23 3
12 +CW9W 956 2013-06-24 4
13 +CW9W 956 2013-06-25 0
14 +CW9W 956 2013-06-26 0
15 +CW9W 956 2013-06-27 0
在最小值和最大值之间创建主时间
# you may need to do this to get the correct dtype
df['ts'] = df['ts'].to_datetime(df['ts'])
In [107]: df
Out[107]:
uuid site ts visit
0 +CW99 1124 2013-06-24 00:00:00 2
1 +CW99 1124 2013-06-26 00:00:00 1
2 +CW99 1124 2013-06-27 00:00:00 1
3 +CW99 1124 2013-06-20 00:00:00 1
4 +CW99 1124 2013-06-21 00:00:00 1
5 +CW99 1124 2013-06-24 00:00:00 2
6 +CW9W 956 2013-06-21 00:00:00 4
7 +CW9W 956 2013-06-22 00:00:00 2
8 +CW9W 956 2013-06-23 00:00:00 3
9 +CW9W 956 2013-06-24 00:00:00 4
In [106]: df.dtypes
Out[106]:
uuid object
site int64
ts datetime64[ns]
visit int64
dtype: object
应用该函数(如果需要,还可以按uuid、站点进行分组)
注意:您在发布的框架中有一个副本。不确定这是否是有意的
我保留了这个。如果没有重复项(在ts
列中),这是一个稍微容易一些的问题
这是禁止重复的方法
In [116]: df.groupby('uuid').apply(f)
Out[116]:
uuid site ts visit
uuid
+CW99 3 +CW99 1124 2013-06-20 00:00:00 1
4 +CW99 1124 2013-06-21 00:00:00 1
0 +CW99 1124 2013-06-24 00:00:00 2
5 +CW99 1124 2013-06-24 00:00:00 2
6 +CW99 1124 2013-06-25 00:00:00 0
1 +CW99 1124 2013-06-26 00:00:00 1
2 +CW99 1124 2013-06-27 00:00:00 1
+CW9W 0 +CW9W 956 2013-06-21 00:00:00 4
1 +CW9W 956 2013-06-22 00:00:00 2
2 +CW9W 956 2013-06-23 00:00:00 3
3 +CW9W 956 2013-06-24 00:00:00 4
4 +CW9W 956 2013-06-25 00:00:00 0
这将强制所有元素都在那里(注意
NaN
因为无法在第一个元素上ffill
)。如果需要,您可以删除这些。谢谢杰夫,复制品是无意的。如果不允许重复ts,如何解决此问题?添加了非重复ts…..这是一个包含所有日期的解决方案(但如果不是==最小值,则某些第一个具有NaN值)。仅供参考,如果检测到DUP,它将引发异常。除了那些NAN之外,它几乎满足了我的需要。也许我应该按uuid和站点分组,然后重置索引以获得NANfillna
。在函数f
中。您可以执行:x['uuid']=x['uuid'].fillna(x['uuid'].unique()[0])
例如,您还可以按照建议执行groupby。这里有很多东西可以玩
In [103]: def f(x):
# we want all of the ``ts`` column that are not in the master time series
.....: adf = DataFrame(dict(ts = all_ts-Index(x['ts'])),columns=df.columns)
# they should have visit of 0
.....: adf['visit'] = 0
# first add them to the frame (x), ignoring the index
# sort by the ts column
# then fillforward missing values
.....: return x.append(adf,ignore_index=True).sort_index(by='ts').ffill()
.....:
In [116]: df.groupby('uuid').apply(f)
Out[116]:
uuid site ts visit
uuid
+CW99 3 +CW99 1124 2013-06-20 00:00:00 1
4 +CW99 1124 2013-06-21 00:00:00 1
0 +CW99 1124 2013-06-24 00:00:00 2
5 +CW99 1124 2013-06-24 00:00:00 2
6 +CW99 1124 2013-06-25 00:00:00 0
1 +CW99 1124 2013-06-26 00:00:00 1
2 +CW99 1124 2013-06-27 00:00:00 1
+CW9W 0 +CW9W 956 2013-06-21 00:00:00 4
1 +CW9W 956 2013-06-22 00:00:00 2
2 +CW9W 956 2013-06-23 00:00:00 3
3 +CW9W 956 2013-06-24 00:00:00 4
4 +CW9W 956 2013-06-25 00:00:00 0
In [207]: def f(x):
.....: x = x.set_index('ts').reindex(all_ts).reset_index()
.....: x['visit'] = x['visit'].fillna(0)
.....: return x.ffill()
.....:
In [208]: df_no_dups.groupby('uuid').apply(f)
Out[208]:
index uuid site visit
uuid
+CW99 0 2013-06-20 00:00:00 +CW99 1124 1
1 2013-06-21 00:00:00 +CW99 1124 1
2 2013-06-22 00:00:00 +CW99 1124 0
3 2013-06-23 00:00:00 +CW99 1124 0
4 2013-06-24 00:00:00 +CW99 1124 2
5 2013-06-25 00:00:00 +CW99 1124 0
6 2013-06-26 00:00:00 +CW99 1124 1
7 2013-06-27 00:00:00 +CW99 1124 1
+CW9W 0 2013-06-20 00:00:00 NaN NaN 0
1 2013-06-21 00:00:00 +CW9W 956 4
2 2013-06-22 00:00:00 +CW9W 956 2
3 2013-06-23 00:00:00 +CW9W 956 3
4 2013-06-24 00:00:00 +CW9W 956 4
5 2013-06-25 00:00:00 +CW9W 956 0
6 2013-06-26 00:00:00 +CW9W 956 0
7 2013-06-27 00:00:00 +CW9W 956 0