Pandas HDFStore:省略重复项

Posted

技术标签:

【中文标题】Pandas HDFStore:省略重复项【英文标题】:Pandas HDFStore : Omitting Duplicates 【发布时间】:2017-06-12 22:10:12 【问题描述】:

我有一个 HDFStore,我每晚都在其中输入数据。我想知道系统是否崩溃等,我可能会重新运行进程,所以我想确保如果已经存在一行,那么 pandas 在下次运行进程时不包含这个。有没有办法查找重复项而不包含它们?

【问题讨论】:

这个有点含糊,正确的做法是张贴清楚地告诉我们您正在运行什么流程,以便我们根据您的需求为您找到最佳解决方案。 我同意@SRingne。了解您是否有类似于“主键”的东西会很有帮助,这有助于唯一识别每一行...您可以发布一个示例数据集(3-5 行)吗?跨度> 【参考方案1】:

如果您的代码中有数据框,则无论如何都可以添加数据并应用到它:

.drop_duplicates()

这将从数据框中删除所有重复的数据。

希望对你有帮助

【讨论】:

不幸的是,数据太大而无法保存在数据框中,因此这种方法可能不起作用 也许你可以使用 dask?【参考方案2】:

如果您的 HDFStore 中有唯一索引,则可以使用以下方法:

创建示例 DF:

In [34]: df = pd.DataFrame(np.random.rand(5,3), columns=list('abc'))

In [35]: df
Out[35]:
          a         b         c
0  0.407144  0.972121  0.462502
1  0.044768  0.165924  0.852705
2  0.703686  0.156382  0.066925
3  0.912794  0.362916  0.866779
4  0.156249  0.625272  0.360799

保存到 HDFStore:

In [36]: store = pd.HDFStore(r'd:/temp/t.h5')

In [37]: store.append('test', df, format='t')

向我们的 DF 添加一个新行:

In [38]: df.loc[len(df)] = [-1, -1, -1]

In [39]: df
Out[39]:
          a         b         c
0  0.407144  0.972121  0.462502
1  0.044768  0.165924  0.852705
2  0.703686  0.156382  0.066925
3  0.912794  0.362916  0.866779
4  0.156249  0.625272  0.360799
5 -1.000000 -1.000000 -1.000000   # new row, which is NOT in the HDF file

选择重复行的索引:

In [40]: idx = store.select('test', where="index in df.index", columns=['index']).index

检查:

In [41]: df.query("index not in @idx")
Out[41]:
     a    b    c
5 -1.0 -1.0 -1.0

仅将那些尚未保存的行附加到 HDFStore:

In [42]: store.append('test', df.query("index not in @idx"), format='t')

检查:

In [43]: store.select('test')
Out[43]:
          a         b         c
0  0.407144  0.972121  0.462502
1  0.044768  0.165924  0.852705
2  0.703686  0.156382  0.066925
3  0.912794  0.362916  0.866779
4  0.156249  0.625272  0.360799
5 -1.000000 -1.000000 -1.000000   # new row has been added

【讨论】:

在尝试了这个解决方案之后,它对于小型 (~1GB) HDF 存储非常有效,但是对于更大的表,查询 index not in @idx 的查找时间太大。如果您想很少添加数据,这将不是问题,但在我的情况下,因为我像数据库一样“滥用”HDFstore,所以延迟太多了。 @MakisTsantekidis,IMO 这很自然——我们想检查整个 HDF 文件中索引中的重复项。因此,HDF 文件越大,所需的时间就越长。根据您的具体情况,您可能需要检查 HDF 文件中的 max(index) 并将 DF 中的索引值与 max_index_value 进行比较 ... 如果传入“记录”的索引被排序,这是个好建议。在索引未以有序方式到达的情况下,我的加速想法是查询一次现有(重复)索引并将它们保存在内存中,以检查下一批记录。 好吧,如果你有能力将巨大 HDF 文件中的所有索引值保存在内存中,那么它应该可以工作......

以上是关于Pandas HDFStore:省略重复项的主要内容,如果未能解决你的问题,请参考以下文章

Pandas HDFStore 从内存中卸载数据帧

使用 Pandas HDFStore 以只读模式打开文件

使用 Pandas 从大型 HDFStore 表中提高查询性能

获取 HDF5 内容列表(Pandas HDFStore)

Python pandas 'HDFStore requires PyTables' Issue

pandas.HDFStore:如何修改现有商店的“data_columns”?我想为不在数据列中的列添加索引