如何在pandas dataframe中移除重复的分组?

2024-05-14 03:22:57 发布

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

我想删除数据帧中的重复集。你知道吗

import pandas as pd
import pdb
filename = "result_4_tiling_116.csv"

chunksize = 10 ** 6
for chunk in pd.read_csv(filename, names=['id', 'tileID', 'x', 'y', 'h', 'w'], chunksize=chunksize):
    pdb.set_trace()

前31行数据的示例:

chunk.head(31)

      tileID  x     y  h    w
0          0  0   0.0  1  8.0
1          1  0   8.0  1  8.0
2          0  0   8.0  1  8.0
3          1  0   0.0  1  4.0
4          2  0   4.0  1  4.0
5          0  0   0.0  1  4.0
6          1  0   4.0  1  4.0
7          2  0   8.0  1  4.0
8          3  0  12.0  1  4.0
9          0  0   4.0  1  4.0
10         1  0   8.0  1  4.0
11         2  0  12.0  1  4.0
12         3  0   0.0  1  2.0
13         4  0   2.0  1  2.0
14         0  0   8.0  1  4.0
15         1  0  12.0  1  4.0
16         2  0   0.0  1  2.0
17         3  0   2.0  1  2.0
18         4  0   4.0  1  2.0
19         5  0   6.0  1  2.0
20         0  0  12.0  1  4.0
21         1  0   0.0  1  2.0
22         2  0   2.0  1  2.0
23         3  0   4.0  1  2.0
24         4  0   6.0  1  2.0
25         0  0   8.0  1  4.0
26         1  0  12.0  1  4.0
27         2  0   0.0  1  2.0
28         3  0   2.0  1  2.0
29         4  0   4.0  1  2.0
30         5  0   6.0  1  2.0

我想把重复的过滤掉。数据包含一组组(从tileID=0开始的每个组),如下所示: 1你知道吗

0          0  0   0.0  1  8.0
1          1  0   8.0  1  8.0

2。你知道吗

2          0  0   8.0  1  8.0
3          1  0   0.0  1  4.0
4          2  0   4.0  1  4.0

三。你知道吗

5          0  0   0.0  1  4.0
6          1  0   4.0  1  4.0
7          2  0   8.0  1  4.0
8          3  0  12.0  1  4.0

第四条。你知道吗

9          0  0   4.0  1  4.0
10         1  0   8.0  1  4.0
11         2  0  12.0  1  4.0
12         3  0   0.0  1  2.0
13         4  0   2.0  1  2.0

五。你知道吗

14         0  0   8.0  1  4.0
15         1  0  12.0  1  4.0
16         2  0   0.0  1  2.0
17         3  0   2.0  1  2.0
18         4  0   4.0  1  2.0
19         5  0   6.0  1  2.0

六。你知道吗

20         0  0  12.0  1  4.0
21         1  0   0.0  1  2.0
22         2  0   2.0  1  2.0
23         3  0   4.0  1  2.0
24         4  0   6.0  1  2.0

七。你知道吗

25         0  0   8.0  1  4.0
26         1  0  12.0  1  4.0
27         2  0   0.0  1  2.0
28         3  0   2.0  1  2.0
29         4  0   4.0  1  2.0
30         5  0   6.0  1  2.0

在本例中,5和7是重复数据。我尝试使用drop_duplicates,但还没有成功。你知道吗


Tags: csv数据inimportpandasforasresult
2条回答

但看,你的复制品是有效的

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.drop_duplicates(subset=['A', 'C'], keep=False)
print(df)

这可能不是解决这个问题的最有效方法,但它给出了正确的结果。你知道吗

df作为初始数据帧:

unique_chunks = []
for _, chunk in df.groupby((df['tileID'].diff() != 1).cumsum()):
    unindexed_chunk = chunk.reset_index(drop=True)

    for unique_chunk in unique_chunks:
        unindexed_unique_chunk = unique_chunk.reset_index(drop=True)
        if unindexed_chunk.equals(unindexed_unique_chunk):
            break
    else:
        unique_chunks.append(chunk)

output_df = pd.concat(unique_chunks)

将提供:

    tileID  x     y  h    w
0        0  0   0.0  1  8.0
1        1  0   8.0  1  8.0
2        0  0   8.0  1  8.0
3        1  0   0.0  1  4.0
4        2  0   4.0  1  4.0
5        0  0   0.0  1  4.0
6        1  0   4.0  1  4.0
7        2  0   8.0  1  4.0
8        3  0  12.0  1  4.0
9        0  0   4.0  1  4.0
10       1  0   8.0  1  4.0
11       2  0  12.0  1  4.0
12       3  0   0.0  1  2.0
13       4  0   2.0  1  2.0
14       0  0   8.0  1  4.0
15       1  0  12.0  1  4.0
16       2  0   0.0  1  2.0
17       3  0   2.0  1  2.0
18       4  0   4.0  1  2.0
19       5  0   6.0  1  2.0
20       0  0  12.0  1  4.0
21       1  0   0.0  1  2.0
22       2  0   2.0  1  2.0
23       3  0   4.0  1  2.0
24       4  0   6.0  1  2.0

这里的想法是迭代初始数据帧的块,将它们收集到一个列表中,并检查当前迭代中的块是否已经存在于该列表中。别忘了重新设置索引!你知道吗

有关如何迭代块的解释,请参见this answer。你知道吗


编辑:
对于~20Gb的巨大输入文件,您可以尝试将处理过的唯一块保存到一个文件中,而不是将它们保存在一个列表中,然后按块读取它们,方法与处理输入文件相同。你知道吗

相关问题 更多 >