我有一个信号日志,其中包含大量冗余数据,我用 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 上运行。因此,如果我尝试解析一个大文件,服务器就会崩溃。所以我的问题是:
您可以尝试打破连续部分的逻辑,以避免同时将所有内容都存储在内存中。我还会避免
~
运算并直接使用 !=
: 计算逆矩阵
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