【发布时间】:2020-06-26 02:21:21
【问题描述】:
我想计算不同文件夹中的重复文件。这些文件具有不同的名称,因此我使用每个文件的校验和来跟踪重复项。这是样本数据
import pandas as pd
df = pd.DataFrame({
'folder': ['d1', 'd1', 'd1', 'd2', 'd2', 'd2', 'd2', 'd2'],
'checksum': ['x0', 'x1', 'x1', 'x1', 'x2', 'x2', 'x2', 'x3']})
df.head(10)
folder checksum
d1 x0
d1 x1
d1 x1
d2 x1
d2 x2
d2 x2
d2 x2
d2 x3
这是我的解决方案,但我不喜欢它,因为它太长了。有谁知道使用Pandas.pivot_table 或Pandas.crosstab 之类的更好的方法来获得相同的结果?谢谢
def count_duplicated_checksum_among_folders(df):
folders = df.folder.unique()
result = []
for fol1 in folders:
row = []
selected1 = df[(df.folder == fol1 ) & df.checksum.duplicated(keep=False)]
dup_checksum = selected1.checksum.unique()
for fol2 in folders:
if fol1 == fol2 :
total_dup = selected1.checksum.duplicated(keep=False).sum()
row.append(total_dup)
else:
selected2 = df[(df.folder == fol2) & df.checksum.isin(dup_checksum)]
total_dup = selected2.checksum.unique().size
row.append(total_dup)
result.append(row)
return pd.DataFrame(result, columns=folders, index=folders)
预期输出
output = count_duplicated_checksum_among_folders(df)
d1 d2
d1 2 1
d2 1 3
由于本例中有 2 个文件夹,因此预期输出为 2x2 矩阵
[[A, B]
[C, D]]
A = total duplicates within folder d1
D = total duplicates within folder d2
B = C = total duplicates that exist in both folders d1 and d2
理想的解决方案必须能够处理任意数量的文件夹。这是另一个包含 5 个文件夹的数据集。预期的答案也在下面给出。
folder = 'd1 d1 d1 d2 d2 d2 d2 d2 d3 d3 d1 d4 d1 d5'.split()
checksum = 'x0 x1 x1 x1 x2 x2 x2 x3 x4 x4 x4 x5 x5 x6'.split()
df2 = pd.DataFrame(dict(folder=folder, checksum=checksum))
d1 d2 d3 d4 d5
d1 2 1 1 1 0
d2 1 3 0 0 0
d3 1 0 2 0 0
d4 1 0 0 0 0
d5 0 0 0 0 0
【问题讨论】:
-
x和d是什么关系?一条建议,没有人可能会阅读您的代码。对问题的简明描述或预期输出的列表会吸引快速答案。
-
@wwnde 我认为代码的工作版本描述了期望的结果,而不是输出。即使我不“阅读”它,我也可能想用它来检查我的解决方案。
-
@wwnde, x 是文件的校验和。如果文件的内容不同或被改变,它的校验和也会改变。文件被复制到不同的文件夹,因此存在重复。所以这个函数的目标是跟踪重复的计数和它们的文件夹位置S