微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用python比较并查找跨数据框的重复值不是整个列

如何解决使用python比较并查找跨数据框的重复值不是整个列

我的时间表数据框架很大,我需要计算进行的实验次数。挑战在于for的用法在行中重复(可以),但在某些(但不是全部)列中重复。我想删除第二个条目(如果重复的话),但是我不能删除整个第二列,因为它也会包含一些新值。如何以并行方式比较两列的各个条目,如果有重复项,如何删除第二列? 此活动的持续时间最长为两天,因此连续三天是一个新的活动,其名称从第三天开始。 实验名称的实际文本很复杂,数据框的宽度为120列,因此无法以列表或字典的形式输入。我希望使用python或numpy函数,但可以使用循环。

以下是开始数据帧和所需输出示例的图片starting data frame example

de-duplicated data frame example

enter image description here

enter image description here

解决方法

df = pd.DataFrame({
    'Monday':['exp_A','exp_A','exp_B',np.nan,'exp_D','exp_D'],'Tuesday':['exp_A','exp_C','Wednesday':['exp_A',np.nan],'Thursday':['exp_A',np.nan]
    })

将每一列与下一列进行比较

for col in range(df.shape[1] - 1):

    duplicate = df.iloc[:,col] == df.iloc[:,col+1]  #check corresponding value in next column 
    df.loc[duplicate,df.columns[col+1] ] = np.nan  #set new value or NA 

注意:如果您在数据中使用dtype对象,则可以使用任何类型的NA值代替np.nan。但是,如果要获得更高的性能,请将实验名称映射为数值,并使用np.nan作为NA值。

,

这是一个hack,类似于@Params的答案,但是会更快,因为您没有经常打电话给.iloc。基本思想是转置数据帧,并根据需要比较所有列重复多次操作。然后将其转置回去,以在OP中获得结果。

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Monday':['exp_A',np.nan]
    })


df = df.T

for i in range(int(np.ceil(df.shape[0]/2))):

    df[(df == df.shift(1))& (df != df.shift(2))] = np.nan
    
df = df.T

  Monday Tuesday Wednesday Thursday
0  exp_A     NaN     exp_A      NaN
1  exp_A     NaN     exp_D      NaN
2  exp_A     NaN       NaN      NaN
3  exp_A     NaN       NaN      NaN
4  exp_B     NaN       NaN      NaN
5    NaN   exp_B       NaN      NaN
6    NaN   exp_C       NaN      NaN
7    NaN   exp_C       NaN      NaN
8  exp_D     NaN     exp_C      NaN
9  exp_D     NaN       NaN      NaN

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。