在pandas数据帧中的行之间添加随机数据

问题描述 投票:1回答:2

我有一个像这样的熊猫数据帧。这包含timestampidfoobartimestamp数据大约每10分钟一次。

timestamp            id  foo  bar
2019-04-14 00:00:10  1   0.10 0.05
2019-04-14 00:10:02  1   0.30 0.10
2019-04-14 00:00:00  2   0.10 0.05
2019-04-14 00:10:00  2   0.30 0.10

对于每个id,我想创建5额外的rowstimestamp在连续的rows之间平均分配,并且foobar值在连续的random之间包含rows值。

开始时间应该是每个timestamp最早的id,结束时间应该是每个timestamp的最新id

所以输出就是这样的。

timestamp            id  foo  bar
2019-04-14 00:00:10  1   0.10 0.05
2019-04-14 00:02:10  1   0.14 0.06
2019-04-14 00:04:10  1   0.11 0.06
2019-04-14 00:06:10  1   0.29 0.07
2019-04-14 00:08:10  1   0.22 0.09
2019-04-14 00:10:02  1   0.30 0.10
2019-04-14 00:00:00  2   0.80 0.50
2019-04-14 00:02:00  2   0.45 0.48
2019-04-14 00:04:00  2   0.52 0.42
2019-04-14 00:06:00  2   0.74 0.48
2019-04-14 00:08:00  2   0.41 0.45
2019-04-14 00:10:00  2   0.40 0.40

我可以重新索引timestamp列并创建额外的timestamp行(例如.Pandas create new date rows and forward fill column values)。

但我似乎无法围绕如何计算连续行之间的foobar的随机值。

感谢有人能指出我正确的方向!

python-3.x pandas
2个回答
2
投票

关闭,你需要的是使用date_rangeDataFrame.reindexDatetimeIndex的第一个和最后一个值:

df['timestamp'] = pd.to_datetime(df['timestamp'])

df = (df.set_index('timestamp')
        .groupby('id')['foo','bar']
        .apply(lambda x: x.reindex(pd.date_range(x.index[0], x.index[-1], periods=6))))

然后创建与原始和DataFrame.fillna缺失值相同大小的帮助器DataFrame:

df1 = pd.DataFrame(np.random.rand(*df.shape), index=df.index, columns=df.columns)
df = df.fillna(df1)
print (df)
                                 foo       bar
id                                            
1  2019-04-14 00:00:10.000  0.100000  0.050000
   2019-04-14 00:02:08.400  0.903435  0.755841
   2019-04-14 00:04:06.800  0.956002  0.253878
   2019-04-14 00:06:05.200  0.388454  0.257639
   2019-04-14 00:08:03.600  0.225535  0.195306
   2019-04-14 00:10:02.000  0.300000  0.100000
2  2019-04-14 00:00:00.000  0.100000  0.050000
   2019-04-14 00:02:00.000  0.180865  0.327581
   2019-04-14 00:04:00.000  0.417956  0.414400
   2019-04-14 00:06:00.000  0.012686  0.800948
   2019-04-14 00:08:00.000  0.716216  0.941396
   2019-04-14 00:10:00.000  0.300000  0.100000

1
投票

如果“随机性”不那么重要。我们可以使用Series.interpolate,它将保持每组minmax之间的值:

df_new = pd.concat([
    d.reindex(pd.date_range(d.timestamp.min(), d.timestamp.max(), periods=6))
    for _, d in df.groupby('id')
])
df_new['timestamp'] = df_new.index
df_new.reset_index(drop=True, inplace=True)

df_new = df_new[['timestamp']].merge(df, on='timestamp', how='left')
df_new['id'].fillna(method='ffill', inplace=True)

df_new[['foo', 'bar']] = df_new[['foo', 'bar']].apply(lambda x: x.interpolate())

其中给出了以下输出:

print(df_new)
                 timestamp   id   foo   bar
0  2019-04-14 00:00:10.000  1.0  0.10  0.05
1  2019-04-14 00:02:08.400  1.0  0.14  0.06
2  2019-04-14 00:04:06.800  1.0  0.18  0.07
3  2019-04-14 00:06:05.200  1.0  0.22  0.08
4  2019-04-14 00:08:03.600  1.0  0.26  0.09
5  2019-04-14 00:10:02.000  1.0  0.30  0.10
6  2019-04-14 00:00:00.000  2.0  0.10  0.05
7  2019-04-14 00:02:00.000  2.0  0.14  0.06
8  2019-04-14 00:04:00.000  2.0  0.18  0.07
9  2019-04-14 00:06:00.000  2.0  0.22  0.08
10 2019-04-14 00:08:00.000  2.0  0.26  0.09
11 2019-04-14 00:10:00.000  2.0  0.30  0.10
© www.soinside.com 2019 - 2024. All rights reserved.