删除pandas中除第一个和最后一个之外的所有重复行

问题描述 投票:0回答:1

我有一个信号日志,其中包含大量冗余数据,我用 pandas 解析这些数据。要删除除第一个和最后一个之外的所有重复行,我使用以下代码:

>>> df = pd.DataFrame(
    {
        "A": [1, 2, 3, 4, 5, 6, 7, 8, 9],
        "B": [0, 0, 0, 0, 1, 1, 1, 2, 3],
    }
)
>>> df
   A  B
0  1  0
1  2  0
2  3  0
3  4  0
4  5  1
5  6  1
6  7  1
7  8  2
8  9  3
>>> df = df[~((df.B == df.B.shift()) & (df.B == df.B.shift(-1)))]
>>> df
   A  B
0  1  0
3  4  0
4  5  1
6  7  1
7  8  2
8  9  3

日志文件可能会变得相当大,达到数百兆字节,并且应用程序在只有 1 Gb RAM 的 AWS EC2 VPS 上运行。因此,如果我尝试解析一个大文件,服务器就会崩溃。所以我的问题是:

  1. 此方法是否需要 RAM 文件大小的 3 倍(因为它“创建”3 个数据帧)?
  2. 有没有更有效的内存方法来做到这一点?
python pandas
1个回答
0
投票

您可以尝试打破连续部分的逻辑,以避免同时将所有内容都存储在内存中。我还会避免

~
运算并直接使用
!=
:

计算逆矩阵
m = df['B'] != df['B'].shift()
m |= df['B'] != df['B'].shift(-1)

out = df[m]

您也可以尝试

diff
shift
更节省内存:

m = df['B'].diff().ne(0)
m |= df['B'].diff(-1).ne(0)

out = df[m]

输出:

   A  B
0  1  0
3  4  0
4  5  1
6  7  1
7  8  2
8  9  3
© www.soinside.com 2019 - 2024. All rights reserved.