从熊猫数据框中删除重复的列值

Chr*_*_vr 1 python pandas

我有以下熊猫数据框。这里 field1, field2... 总是可变的,而 col1, col2 ....coln 大部分是恒定的并且很少变化。最终,我将其保存为镶木地板格式。镶木地板在内部优化了重复项,这不是问题。

我有另一个要求将它从 parquet 转换为 csv。csv 文件大小正在上升。所以我想在将其保存在镶木地板之前删除重复项。通过代码执行此操作会增加时间,因为可能有 70-100 个这样的列。

date                          field1 field2 col1 col2 col3 col5
20200508062904.8340+0530       11       22      2     3    3   4
20200508062904.8340+0530       12       23      2     3    3   4
20200508062904.8340+0530       13       22      2     3    3   4
20200508062904.8340+0530       14       24      2     3    3   4
20200508051804.8340+0530       14       24      2     3    3   5
20200508051804.8340+0530       14       24      2     4    3   4
20200508051804.8340+0530       14       24      2     3    3   4
Run Code Online (Sandbox Code Playgroud)

对于列 (col1 col2 col3 col5),我想保留初始值并删除重复的重复值。如果这些列在稍后的某个时间点具有与初始值不同的值,则数据帧应保留它。初始值是相对的,并且等于前一个最新值。

预期产出

 date                          field1 field2 col1 col2 col3 col5
20200508062904.8340+0530       11       22      2   3    3   4
20200508062904.8340+0530       12       23      
20200508062904.8340+0530       13       22      
20200508062904.8340+0530       14       24      
20200508051804.8340+0530       14       24                    5
20200508051804.8340+0530       14       24               4    4
20200508051804.8340+0530       14       24               3        
Run Code Online (Sandbox Code Playgroud)

drop_duplicates 有助于删除行,在这种情况下它没有用。有没有更好的方法可以在熊猫中实现这一点。

ALo*_*llz 6

创建一个掩码检查列是否等于自身移位,然后填充缺失值

cols = [x for x in df.columns if x.startswith('col')]

#@AndyL. points out this equivalent mask is far simpler
m = df[cols].ne(df[cols].shift())

df[cols] = df[cols].astype('O').where(m).fillna('')
Run Code Online (Sandbox Code Playgroud)
                       date  field1  field2 col1 col2 col3 col5
0  20200508062904.8340+0530      11      22    2    3    3    4
1  20200508062904.8340+0530      12      23                    
2  20200508062904.8340+0530      13      22                    
3  20200508062904.8340+0530      14      24                    
4  20200508051804.8340+0530      14      24                   5
5  20200508051804.8340+0530      14      24         4         4
6  20200508051804.8340+0530      14      24         3          
Run Code Online (Sandbox Code Playgroud)

以前使用了不必要的复杂掩码:

m = ~df[cols].ne(df[cols].shift()).cumsum().apply(pd.Series.duplicated)
Run Code Online (Sandbox Code Playgroud)