我有以下熊猫数据框。这里 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 有助于删除行,在这种情况下它没有用。有没有更好的方法可以在熊猫中实现这一点。
创建一个掩码检查列是否等于自身移位,然后填充缺失值
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)
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |