如何从具有重复项的现有列为 Pandas 数据框设置新索引?

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

我正在从 MongoDB 数据库获取数据并将其转换为 Pandas 数据框,以便稍后完成其他操作。 MongoDB 数据库包含一堆基于时间的条目,并且由于它们的存储方式,每个通道的每个样本都是其自己的文档。其中一些通道始终在同一时间进行采样,而其他通道则按不同的时间表进行采样。以下是文档的快速示例。

timestamp:
    2024-01-05T08:16:30.848+00:00
metaData:
    deviceId:
        "123"
    channelName:
        "Channel1"
_id:
    659c23016ad87924ff552882
Channel1:
    10345

所以当我尝试使用类似的东西从数据库中获取一些频道时

b = pd.DataFrame(list(timeCol.find({'metaData.deviceId':'123','metaData.channelName':{'$in':['Channel1','Channel2','Channel3','Channel4','Channel5']}},{'_id':0,'metaData':0}).sort('timestamp')))

我得到一个如下所示的数据框

                     timestamp  Channel1          Channel2       Channel3        Channel4  Channel5
0      2024-01-05 20:27:31.340    0.0                NaN           NaN             NaN        NaN
1      2024-01-05 20:27:31.382    1.0                NaN           NaN             NaN        NaN
2      2024-01-05 20:27:31.400    NaN               2456           NaN             NaN        NaN
3      2024-01-05 20:27:31.400    NaN                NaN        10.231             NaN        NaN
4      2024-01-05 20:27:31.400    NaN                NaN           NaN             2.4        NaN

但它还有更多条目,因为我通常对几个小时的时间跨度感兴趣。无论如何,正如您所看到的,通道 2-5 通常共享一个时间戳,但通道 1 的速率更高。

有什么方法可以将时间戳列设置为索引,并让 Pandas 仅使用唯一的时间戳条目,然后正确地对其他列进行采样?

我知道我可以通过为每个列创建一个系列,然后合并/连接它们来做到这一点,但我认为这需要为每个通道单独调用数据库,并且我更愿意限制数据库调用以提高速度和效率。我可以请求对数据库进行一些更改,但这就是数据的广播方式(每个通道/设备的单独消息),并且不能保证通道将具有相同的时间戳,但对于某些通道来说,这种情况似乎更常见。还有其他频道的广播速率要高得多,我也需要进行分析,但我计划单独查询这些频道并稍后添加它们。

谢谢!

python pandas mongodb
1个回答
0
投票

如果要合并公共时间戳,请使用

groupby.first
:

out = df.groupby('timestamp').first()

输出:

                         Channel1  Channel2  Channel3  Channel4  Channel5
timestamp                                                                
2024-01-05 20:27:31.340       0.0       NaN       NaN       NaN       NaN
2024-01-05 20:27:31.382       1.0       NaN       NaN       NaN       NaN
2024-01-05 20:27:31.400       NaN    2456.0    10.231       2.4       NaN

如果您想按特定频率(例如 100 毫秒)进行聚合,请使用

resample
聚合(例如此处使用
mean
):

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

out = (df.set_index('timestamp')
         .resample('100ms').mean()
       )

输出:

                         Channel1  Channel2  Channel3  Channel4  Channel5
timestamp                                                                
2024-01-05 20:27:31.300       0.5       NaN       NaN       NaN       NaN
2024-01-05 20:27:31.400       NaN    2456.0    10.231       2.4       NaN
© www.soinside.com 2019 - 2024. All rights reserved.