如何删除熊猫数据框中的重复组?

时间:2018-07-18 11:14:32

标签: python pandas dataframe

我想删除数据框中的重复集。

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

3。

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

4。

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

5。

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

6。

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

7。

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,但尚未成功。

2 个答案:

答案 0 :(得分:1)

但是看起来drop_duplicates是可行的

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)

答案 1 :(得分:1)

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

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的非常大的输入文件,您可以尝试将处理后的唯一块保存到文件中,而不是将它们保留在列表中,然后按块读取它们,就像对输入文件所做的一样。