首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从熊猫数据中删除重复的列值

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

Stack Overflow用户
提问于 2020-07-23 17:52:01
回答 3查看 404关注 0票数 1

我有下面的熊猫数据框架。在这里,field1,field2...are总是变量,而col1、col2 ....coln大多是常量,并且很少变化。最后,我把它保存在format.parquet内部优化复制,这不是一个问题。

我还有另一个要求将它从parquet.The转换为csv文件大小正在上升。所以我想在把它保存在地板上之前先去掉复本。通过代码这样做会增加时间,因为可以有70-100个这样的列。

代码语言:javascript
复制
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

对于列(col1 col2 col3 col5),我希望保留初始值并删除重复的重复值。如果这些列在以后的某个时间点具有与初始值不同的值,数据帧应该保持it.Initial值是相对的,并且等于以前的最新值。

预期输出

代码语言:javascript
复制
 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        

drop_duplicates帮助删除行,在这种情况下它是无用的。在熊猫身上有什么更好的方法来达到这个目的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-23 18:01:13

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

代码语言:javascript
复制
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('')

代码语言:javascript
复制
                       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          

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

代码语言:javascript
复制
m = ~df[cols].ne(df[cols].shift()).cumsum().apply(pd.Series.duplicated)
票数 6
EN

Stack Overflow用户

发布于 2020-07-23 17:59:51

您可以使用.where.shift使连续的值为空,并对每一列执行此操作。如果您有许多列,那么您可以在一个循环中执行下面的操作,就像@ALollz在他的回答中所做的那样。

代码语言:javascript
复制
df['col1'] = df['col1'].where(df['col1'] != df['col1'].shift(), '')

带循环的完整代码:

代码语言:javascript
复制
for col in df.columns:
    if 'col' in col:
        df[col] = df[col].where(df[col] != df[col].shift(), '')

产出:

代码语言:javascript
复制
    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       
票数 3
EN

Stack Overflow用户

发布于 2020-07-23 19:01:24

您可以尝试使用可调用的diffwhere以及fillnareplaceupdate返回到原始df

代码语言:javascript
复制
cols = ['col1', 'col2', 'col3', 'col5']

df.update(df[cols].diff().eq(0).where(lambda x: x)
                               .replace(1,'').fillna(df[cols]))

Out[315]:
                       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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63060287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档