如何基于python中的多个条件重复数据删除excel文件?

我有一个Excel文件( 附在这里 )。 我必须对两个或更多的重复ID进行重复数据删除。 扣除标准是基于多个因素。

  1. ID
  2. types
  3. 时间

现在,我手动关注重复数据的过程是:

  1. 我按照升序排列id。
  2. 我为tid开头的每个id设置Attribute。
  3. 我把id的每一个[id]的xid列。 如果有重复的[id](如果两个连续[id]的date相同),我有时会留下一个空白。
  4. 对于每个重复的ID,我首先检查types,如果它是茶或咖啡。 如果一个人是咖啡,而另一个人是茶,我们总是喜欢咖啡,并将茶的属性设置为“否”。 我们可以得到两个以上的重复,所以我们必须为所有的茶都设置“否”。 如果我们得到两杯咖啡和一杯相同的茶,那么我们会根据时间保留最新的一杯。
  5. 如果重复的ID具有相同的types,那么我们将查看date,并将旧的date的属性设置为“否”。 如果date相同,那么我们将保留一个,并将其他属性设置为“否”。 身份证可以超过两个,但过程将是相同的。

我想要做的是:

  1. 将属性设置为以t开头的ID的tid。
  2. 将属性设置为具有[]的ID的xid。
  3. 如果两个或两个以上的ID根据特定的条件重复,请在属性中设置“否”:

    • 咖啡应该比茶更受欢迎。 如果在重复的ID有茶和咖啡的types,每个重复的ID把每个茶放在属性中。

    • 如果我们为每个重复ID都有一杯茶和两杯咖啡,那么我们将根据时间设置“否”,以确保剩余的咖啡(旧时间戳的ID应为No.)

    • 如果我们对每个重复的ID都有相同的types,那么根据时间应该保持最新的ID,对于所有其他属性应该是No。

    • 如果我们对所有重复的ID都有相同的date和相同的types,那么我们将随机设置除了一个以外的所有对象。

注意:

  • 重复的一,二和三是我们很容易只是过滤出颜色,然后重复数据删除。它们基于Excel公式:(重复1 =(= IF(B2 = B3,1,“”),Duplicate2 =(= IF(C1 = 1,1,“”),Duplicate3 =(= IF(SUM(C2:D2)> = 1,1,“”))
  • 我们不能删除行。
  • 我找不到任何代码,这是我在一个关键的自动化过程中的拦截器。
  • 附件中属性栏中有No / xid / tid,供参考。

重要问题:使用python甚至可能或可行吗?

我不知道我的问题是否正确,因此我将提供几种不同的方法。

如果你想删除所有包含id,Type和Time的值的行,可以这样做:

frame=pd.read_excel(io=r"D:\xxxxxx\test.xlsx") df=pd.DataFrame(frame) drop_dup=df.drop_duplicates(subset=("id","Type","Time")) print(drop_dup) 

这产生:

  id Duplicate 1 Duplicate 2 Total Duplicates \ 0 121349100 NaN NaN NaN 1 121350610 NaN NaN NaN 2 124426041 NaN NaN NaN 3 124436734 NaN NaN NaN 4 124451775 1.0 NaN 1.0 5 124451775 1.0 1.0 1.0 7 124463136 NaN NaN NaN 8 124463568 NaN NaN NaN 9 124469946 NaN NaN NaN 10 124474373 NaN NaN NaN .... Time Type Attribute 0 2017-04-19 18:08:00 Tea NaN 1 2017-04-19 18:08:00 Tea NaN 2 2017-05-05 12:21:00 Tea NaN 3 2017-04-25 15:20:00 Coffee NaN 4 2017-04-05 21:04:00 Coffee No 5 2017-06-05 07:38:00 Tea No 7 2017-06-05 05:40:00 Coffee NaN 8 2017-09-04 23:12:00 Tea NaN 9 2017-04-24 07:48:00 Tea NaN 10 2017-07-05 23:39:00 Coffee NaN .... [77 rows x 7 columns] 

这意味着有7行具有完全相同的types,ID和时间。 如果你想删除完全相同的行(所有的列被合并),这将产生所需的结果:

 df=df.drop_duplicates() 

此外:

 dup=df.duplicated(subset=("id","Type","Time")) 

返回一个True / False数组,表示行是否重复

 0 False 1 False 2 False 3 False 4 False 5 False 6 True 7 False 

如果您想知道DataFrame的哪些值是重复的,请使用:

 dupl_val=df.apply(pd.Series.duplicated,axis=1) id Duplicate 1 Duplicate 2 Total Duplicates Time Type Attribute 0 False False False False False False False 1 False False False False False False False 2 False False False False False False False 3 False False False False False False False 4 False False False True False False False 5 False False True True False False False 6 False False False True False False False 

调用pd.Series.duplicated的原因是该方法应用于DataFrame的轴1,意味着每个DataFrame列。 DataFrame列是pandas系列对象。

如果你不想删除行,只是指出哪些值是重复的使用:

 dupl_val=df.apply(pd.Series.duplicated,axis=1) df=df.where(~dupl_val,"duplicate") print(df) id Duplicate 1 Duplicate 2 Total Duplicates \ 0 121349100 NaN NaN NaN 1 121350610 NaN NaN NaN 2 124426041 NaN NaN NaN 3 124436734 NaN NaN NaN 4 124451775 1 NaN duplicate 5 124451775 1 duplicate duplicate 6 124451775 NaN 1 duplicate Time Type Attribute 0 2017-04-19 18:08:00 Tea NaN 1 2017-04-19 18:08:00 Tea NaN 2 2017-05-05 12:21:00 Tea NaN 3 2017-04-25 15:20:00 Coffee NaN 4 2017-04-05 21:04:00 Coffee No 5 2017-06-05 07:38:00 Tea No 6 2017-04-05 21:04:00 Coffee NaN 

编辑:如果你只是想将属性列设置为一个特殊的值(我select了“重复”),如果一行内的“ID”,“types”,“时间”值是重复的另一行,而不想更改其余列的值,这个代码应该提供所需的结果:

 frame=pd.read_excel(io=r"D:\xxxxx\test.xlsx") df=pd.DataFrame(frame) dup=df.duplicated(subset=("id","Type","Time")) duplicate="duplicate" for i in range(len(dup)): if dup[i]==True: df.loc[i,"Attribute"]=duplicate print(df) id Duplicate 1 Duplicate 2 Total Duplicates \ 0 121349100 NaN NaN NaN 1 121350610 NaN NaN NaN 2 124426041 NaN NaN NaN 3 124436734 NaN NaN NaN 4 124451775 1.0 NaN 1.0 5 124451775 1.0 1.0 1.0 6 124451775 NaN 1.0 1.0 7 124463136 NaN NaN NaN Time Type Attribute 0 2017-04-19 18:08:00 Tea NaN 1 2017-04-19 18:08:00 Tea NaN 2 2017-05-05 12:21:00 Tea NaN 3 2017-04-25 15:20:00 Coffee NaN 4 2017-04-05 21:04:00 Coffee No 5 2017-06-05 07:38:00 Tea No 6 2017-04-05 21:04:00 Coffee duplicate 7 2017-06-05 05:40:00 Coffee NaN [85 rows x 7 columns] 

你可以看到,第6行(=原始excel文件中的第8行)包含第一个副本。 在这种情况下,这是Excel文件中第6行的重复。

编辑2

在我的第二个编辑中,代码现在将所有重复(也是第一个)标记为“重复”。 此外,代码不再为所有三个列(ID,时间,types),而是(ID和时间)OR(ID和types)OR(时间和types)。 因此,这三个coumns的所有组合

 dup=[df.duplicated(subset=(i),keep=False) for i in [("id","Type"),("id","Time"),("Time","Type")]] duplicate="duplicate" for i in range(len(dup)): for j in range(len(dup[i])): if dup[i][j]==True: df.loc[j,"Attribute"]=duplicate print(df) 

|

  id Duplicate 1 Duplicate 2 Total Duplicates \ 0 121349100 NaN NaN NaN 1 121350610 NaN NaN NaN 2 124426041 NaN NaN NaN 3 124436734 NaN NaN NaN 4 124451775 1.0 NaN 1.0 5 124451775 1.0 1.0 1.0 6 124451775 NaN 1.0 1.0 Time Type Attribute 0 2017-04-19 18:08:00 Tea duplicate 1 2017-04-19 18:08:00 Tea duplicate 2 2017-05-05 12:21:00 Tea NaN 3 2017-04-25 15:20:00 Coffee NaN 4 2017-04-05 21:04:00 Coffee duplicate 5 2017-06-05 07:38:00 Tea No 6 2017-04-05 21:04:00 Coffee duplicate 

有关此函数的更多信息,请参阅: drop_duplicates ,对于Series和DataFrames都是重复的(主要区别在于对于Series,函数应用于单个值,对于DataFrame,它们分别应用于行到指定列的行)