我想读取其中包含一些.csv文件的文件夹,并查找重复的坐标。 .csv如下所示:
0 0 0 1 1
0 1 2 1 1
0 0 0 1 2
...
这里将是第0行和第2行重复,因为前三列(坐标)相同。
我认为也许在比较之前对数据帧进行排序会加快代码的速度。但是我不确定如何在python中正确排序(我会按照第一列对其进行排序。然后,对于第一列中相同的每个元素,第二列中的每个元素都相同,第三列中的元素相同。因此,数据帧:>
0 1 1 1 1
0 1 0 1 2
2 0 1 0 0
0 0 0 1 1
would look like this:
0 0 0 1 1
0 1 0 1 2
0 1 1 1 1
2 0 1 0 0
到目前为止,我的代码如下:
import pandas as pd
import glob
import numpy as np
from tkinter import filedialog
path = filedialog.askdirectory(title="Select Coordinate File")
all_files = glob.glob(path + "/*.csv")
li = []
for filename in all_files:
df = pd.read_csv(filename, index_col=None, header=0)
li.append(df)
frame = pd.concat(li, axis=0, ignore_index=True)
# Sort frame
# Compare rows
答案 0 :(得分:1)
您可以使用groupby。喜欢:
deduplicated_df= df.groupby(['NameCol1', 'NameCol2', 'NameCol3']).aggregate('first')
在这种情况下,三列的每种组合都将获得一行。其他列值取自前三行中具有相同值组合的第一条记录。
这使前3列索引列。如果您需要将它们作为常规列,只需执行以下操作:
deduplicated_df.reset_index(inplace=True)
哦,我重读了。不确定,如果您只是想消除重复项(上述方法就是这样做的),或者打印重复的坐标。在后一种情况下,您可以执行与上述类似的操作。我猜你只需要坐标,对吧?
在这种情况下,您可以再次分组并产生一个计数列(“ NameCol4”可以是df中任何现有的列),然后选择计数大于1的所有行。
deduplicated_df= df.groupby(['NameCol1', 'NameCol2', 'NameCol3']).aggregate({'NameCol4': 'count'})
deduplicated_df.reset_index(inplace=True)
deduplicated_df[deduplicated_df['NameCol4']>1]