我不知道你的问题是否正确,因此我将提供几种不同的方法。
如果您想删除所有包含相同 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 行具有完全相同的 Type、id 和 Time。
如果您想删除完全相同的行(合并所有列),这将产生所需的结果:
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 Series 对象。
如果您不想删除行,而只是指出哪些值是重复的,请使用:
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
编辑:
如果您只想将 Attribute 列设置为特殊值(我选择了“duplicate”),如果一行中的“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、时间、类型),而是搜索(id 和时间)或(id 和类型)或(时间和类型)。因此这三个数的所有组合
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、duplicated,适用于 Series 和 DataFrame(主要区别在于,对于 Series,函数应用于单个值,而对于 DataFrame,它们分别应用于行以指定列的行)