如何在python中基于多个条件删除excel文件?

2024-05-23 14:20:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Excel文件(attached here)。我必须根据两个或多个重复的ID进行重复数据消除。 重复数据消除的标准基于多个因素。在

  1. 身份证
  2. 类型
  3. 时间

现在,我手动执行重复数据消除的过程是:

  1. 我按升序排列id。在
  2. 我为每个以t开头的id设置属性作为tid。在
  3. 我在id列中为每个[id]输入xid。如果有重复的[id],我有时会为一个id留空(如果连续两个[id]的日期相同)。在
  4. 对于每一个重复的身份证,我首先检查类型是茶还是咖啡。如果一个是咖啡,另一个是茶,我们总是喜欢咖啡,并为茶设置“否”属性。我们可以得到两个以上的重复,所以,我们必须设置“否”为所有的茶相同的ID。如果同一身份证有两杯咖啡和一杯茶,我们将根据时间保留最新的一份。在
  5. 如果重复的id具有相同的类型,那么我们将查看日期并将属性设置为“No”(对于较早的日期)。如果日期相同,那么我们将保留一个,并将其他日期的属性设置为“否”。ID可以是两个以上,但过程是相同的。在

我想做的是:

  1. 将属性设置为以t开头的id的tid
  2. 对于具有[]的id,将属性设置为xid。在
  3. 如果两个或多个标识基于特定条件重复,请在属性中设置“否”:

    • 咖啡应该比茶好。如果我们有茶和咖啡 对于重复的id,我们在每个tea的属性中都没有 每个重复的ID。

    • 以防每张身份证都有一杯茶和两杯或两杯以上的咖啡 然后我们将根据时间(ID)对剩余咖啡设置“否” 如果时间戳较旧,则应为“否”。

    • 如果每个重复的ID都有相同的类型,那么以哪个ID为准 应保留最新的根据时间和所有其他属性 应该是No.

    • 如果所有重复的ID都有相同的日期和类型,那么 没有人会随机反对所有人。

注意:

  • 复制一,二和三是我们可以很容易地根据颜色过滤出来,然后重复数据消除。他们基于Excel公式:(Duplicate 1=(=IF(B2=B3,1,“”),Duplicate2=(=IF(C1=1,1,“”),Duplicate3=(=IF(SUM(C2:D2)>;=1,1,“”)
  • 无法删除行。在
  • 我找不出这方面的任何代码,这是我在一个关键自动化过程中的拦路虎。在
  • 附件中的属性列中没有/xid/tid以供参考。在

重要问题: -使用python有可能或者可行吗?在


Tags: 文件数据noid类型if属性过程
1条回答
网友
1楼 · 发布于 2024-05-23 14:20:56

我不知道我是否正确回答了你的问题,所以我会提供一些不同的方法。在

如果要删除包含相同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)

结果是:

^{pr2}$

这意味着有7行具有完全相同的类型、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

如果您想知道数据帧的哪些单个值是重复的,请使用:

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系列复制此方法应用于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  

编辑: 如果您只想将属性列设置为一个特殊值(我选择了“复制”),如果一行中的“id”、“Type”、“Time”值与另一行重复,并且不想更改其余列的值,则此代码应提供所需的结果:

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、Time、Type),而是查找(id和Time)或(id和Type)或(Time和Type)。因此,这三个会议的所有组合

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_duplicatesduplicated用于Series和DataFrames(主要区别在于,对于Series,函数应用于单个值,对于dataframe,它们分别应用于指定列的行)

相关问题 更多 >