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 表中提高查询性能