在 Jezrael 的帮助下,我可以编辑我的 python 脚本:
import os
import glob
import pandas as pd
os.chdir("files")
extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]
# combine all files in the folder
dfs_to_concat = []
for f in all_filenames:
df = pd.read_csv(f, sep=";")
df['file_identifier'] = [f] * len(df.index)
dfs_to_concat.append(df)
combined_csv = pd.concat(dfs_to_concat)
# remove duplicates
m1 = combined_csv.duplicated()
m2 = combined_csv.duplicated(subset=combined_csv.columns[:-1])
combined_csv_final = combined_csv[m1 | ~m2]
# export to csv
combined_csv_final.to_csv("combined_csv_final.csv", index=False, sep=";", encoding='utf-8-sig')
这个脚本应该做的是:
仅删除“file_identifier”不同的所有重复行。不要删除“file_identifier”相同的重复项。
但是,它不起作用。它不会删除具有不同文件标识符的重复行。事实上,它不会删除任何重复的行。
有谁知道哪里出了问题吗?显然在 Jezraels 示例中,它按预期工作。
最佳答案
您可以将 m1
中每个 ech 文件的测试欺骗与没有最后一列的测试欺骗结合起来,使用 |
进行按位 OR
与 ~
反转掩码:
m1 = combined_csv.duplicated()
m2 = combined_csv.duplicated(subset=combined_csv.columns[:-1])
df = df[m1 | ~m2]
示例:
df = pd.DataFrame({
'a':[4,5,4,5,4,6],
'b':[7,8,7,4,7,8],
'file_identifier':list('aaabbb')
})
print (df)
a b file_identifier
0 4 7 a
1 5 8 a
2 4 7 a
3 5 4 b
4 4 7 b <- dupe with different filename
5 6 8 b
m1 = df.duplicated()
#print (m1)
m2 = df.duplicated(subset=df.columns[:-1])
#print (m2)
df = df[m1 | ~m2]
print (df)
a b file_identifier
0 4 7 a
1 5 8 a
2 4 7 a
3 5 4 b
5 6 8 b
关于python - 删除 pandas where 中的 "duplicate rows"并附加条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59559718/