如何解决使用python比较并查找跨数据框的重复值不是整个列
我的时间表数据框架很大,我需要计算进行的实验次数。挑战在于for的用法在行中重复(可以),但在某些(但不是全部)列中重复。我想删除第二个条目(如果重复的话),但是我不能删除整个第二列,因为它也会包含一些新值。如何以并行方式比较两列的各个条目,如果有重复项,如何删除第二列? 此活动的持续时间最长为两天,因此连续三天是一个新的活动,其名称从第三天开始。 实验名称的实际文本很复杂,数据框的宽度为120列,因此无法以列表或字典的形式输入。我希望使用python或numpy函数,但可以使用循环。
以下是开始数据帧和所需输出示例的图片。starting data frame example
de-duplicated data frame example
解决方法
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 举报,一经查实,本站将立刻删除。