Skip to main content
 首页 » 编程设计

python之Pandas HDFStore : Omitting Duplicates

2025年05月04日15zhenyulu

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

请您参考如下方法:

如果您的 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