如果其他列中的单元格符合我的条件
,我想重新采样数据框df = pd.DataFrame({
'timestamp': [
'2013-03-01 08:01:00', '2013-03-01 08:02:00',
'2013-03-01 08:03:00', '2013-03-01 08:04:00',
'2013-03-01 08:05:00', '2013-03-01 08:06:00'
],
'Kind': [
'A', 'B', 'A', 'B', 'A', 'B'
],
'Values': [1, 1.5, 2, 3, 5, 3]
})
对于每个时间戳,我可能有2-10种,我想要正确重新采样而不产生NaN
。目前,我使用以下代码对整个数据框进行重新取样,然后获取NaNs
。我认为这是因为我有多个条目用于某些时间戳。
df.set_index('timestamp').resample('5Min').mean()
一种方法是为每种类型创建不同的数据帧,重新采样每个数据帧,并加入生成的数据帧。我想知道是否有任何简单的方法。
答案 0 :(得分:3)
按照您的说明定义数据框后,您应该先将timestamp
列转换为datetime
。然后将其设置为索引,最后重新采样并找到平均值,如下所示:
import pandas as pd
df = pd.DataFrame({
'timestamp': [
'2013-03-01 08:01:00', '2013-03-01 08:02:00',
'2013-03-01 08:03:00', '2013-03-01 08:04:00',
'2013-03-01 08:05:00', '2013-03-01 08:06:00'
],
'Kind': [
'A', 'B', 'A', 'B', 'A', 'B'
],
'Values': [1, 1.5, 2, 3, 5, 3]
})
df.timestamp = pd.to_datetime(df.timestamp)
df = df.set_index(["timestamp"])
df = df.resample("5Min")
print df.mean()
这将打印您期望的平均值:
>>>
Values 2.75
您的数据框将导致:
>>> df
Values
timestamp
2013-03-01 08:05:00 2.5
2013-03-01 08:10:00 3.0
按类别分组
如果你想按种类分组并获得每种种类的平均值(意思是A和B),你可以按如下方式进行:
df.timestamp = pd.to_datetime(df.timestamp)
df = df.set_index(["timestamp"])
gb = df.groupby(["Kind"])
df = gb.resample("5Min")
print df.xs("A", level = "Kind").mean()
print df.xs("B", level = "Kind").mean()
结果你会得到:
>>>
Values 2.666667
Values 2.625
您的数据框最终会显示为:
>>> df
Values
Kind timestamp
A 2013-03-01 08:05:00 2.666667
B 2013-03-01 08:05:00 2.250000
2013-03-01 08:10:00 3.000000
答案 1 :(得分:0)
首先,最好将'timestamp'
列明确转换为DatetimeIndex
类型:
df = pd.DataFrame({
'timestamp': pd.to_datetime([
'2013-03-01 08:01:00', '2013-03-01 08:02:00',
'2013-03-01 08:03:00', '2013-03-01 08:04:00',
'2013-03-01 08:05:00', '2013-03-01 08:06:00']),
'Kind': ['A', 'B', 'A', 'B', 'A', 'B'],
'Values': [ 1, 4.5, 2, 7, 5, 9] })
请注意B
种类的更改值。现在,当您重新采样mean()
时,估算新值为两个现有值的平均值。可能会发生多个新数据点落在现有数据点之间的情况,而pandas
会使用NaNs
填充其值。您可以使用ffill()
或bfill()
,具体取决于您希望关闭的时间间隔的一侧。默认情况下,它是左侧,因此bfill()
是选择。
df.set_index('timestamp').groupby('Kind').resample('1.5Min')['Values'].bfill().reset_index()
Out[1]:
Kind timestamp Values
0 A 2013-03-01 08:00:00 1.0
1 A 2013-03-01 08:01:30 2.0
2 A 2013-03-01 08:03:00 2.0
3 A 2013-03-01 08:04:30 5.0
4 B 2013-03-01 08:01:30 4.5
5 B 2013-03-01 08:03:00 7.0
6 B 2013-03-01 08:04:30 9.0
7 B 2013-03-01 08:06:00 9.0
它将使用上次观察到的值来填充NaNs
。
如果您希望插值,而不仅仅是填补空白,请使用transform(pd.Series.interpolate)
组合。 transform
将在每个组中应用interpolate()
功能。尝试以更高的频率(例如10秒)进行重新采样,您将看到两种方法之间的巨大差异。
df = df.set_index('timestamp').groupby('Kind').resample('1.5Min').mean().transform(pd.Series.interpolate).reset_index()
Out[2]:
Kind timestamp Values
0 A 2013-03-01 08:00:00 1.0
1 A 2013-03-01 08:01:30 1.5
2 A 2013-03-01 08:03:00 2.0
3 A 2013-03-01 08:04:30 5.0
4 B 2013-03-01 08:01:30 4.5
5 B 2013-03-01 08:03:00 7.0
6 B 2013-03-01 08:04:30 8.0
7 B 2013-03-01 08:06:00 9.0
答案 2 :(得分:0)
df = df.set_index('timestamp') # Set your index.
df.index = df.index.astype('datetime64') # Set to DatetimeIndex (Index doesn't work with resample)
df.resample('5Min').mean() # Do the actual resampling.
这将返回一个包含2行的数据帧:
Values
timestamp
2013-03-01 08:00:00 1.875
2013-03-01 08:05:00 4.000
您的“Kind”列已被删除,因为取字符均值是没有意义的。如果你想保留它,你必须引入一个新规则(例如为给定时期分配最常用的字符)。
答案 3 :(得分:0)
设置时间戳以键入datetime,然后将其用作索引。
df.timestamp = pd.to_datetime(df.timestamp)
df = df.set_index(["timestamp"])
来自您自己选择的列的样本,例如:来自A类的样本:
df[df.Kind=='A'].sample(1)
Kind Values
timestamp
2013-03-01 08:03:00 A 2.0
然后进行计算:
df[df.Kind=='A'].sample(2).mean()
Values 1.5
dtype: float64