有条件地删除Pandas数据框行

5

我希望删除那些前一行和后一行在 num2 列具有相同值的行。

我的数据框如下:

import pandas as pd

df = pd.DataFrame([
    [12, 10],
    [11, 10],
    [13, 10],
    [42, 11],
    [4, 11],
    [5, 2]
], columns=["num1", "num2"]
)

以下是我的目标:

df = pd.DataFrame([
    [12, 10],
    [13, 10],
    [42, 11],
    [4, 11],
    [5, 2]
], columns=["num1", "num2"]
)

我尝试过的方法:

df["num1_diff"] = df["num2"].diff().fillna(0).astype(int)
filt = df["num1_diff"].apply(lambda x: x == 0)
print(df[filt])

提供:

   num1  num2  num1_diff
0    12    10          0
1    11    10          0
2    13    10          0
4     4    11          0

我在想要使用新的num1_diff列来进行过滤。 这种方法好吗?或者还有更好的方法吗?

3个回答

6

使用 Series.shift 两次,然后检查 num2 是否等于:

df[df['num2'].shift().ne(df['num2'].shift(-1))]

   num1  num2
0    12    10
2    13    10
3    42    11
4     4    11
5     5     2

请注意,即使当前行与前后两行的值不同,此解决方案也会删除该行。这是期望的行为吗? - Phoenixo

2
IIUC,
df.loc[df['num2'].diff() != df['num2'].diff(-1)]

输出

   num1  num2
0    12    10
2    13    10
3    42    11
4     4    11
5     5     2

如果需要三个内容都匹配:

df.loc[df['num2'].diff().bfill().rolling(3, center=True).sum().eq(0)]

1

如果您只想删除在列num2的前一行、当前行和后一行的值相同时,请使用以下方法:

df[~(df['num2'].eq(df['num2'].shift()) & df['num2'].eq(df['num2'].shift(-1)))]

这是一个例子:

这里是一个段落。

   num1  num2
0    12    10
1    11    10
2    13    10
3     1    26
4     2     7  # <---- Do you want to drop this value ? if yes, consider Erfan 's solution
5     3    26       # if you want to keep it, I proposed another solution b)

import pandas as pd

df = pd.DataFrame([
    [12, 10],
    [11, 10],
    [13, 10],
    [1, 26],
    [2, 7],
    [3, 26]
], columns=["num1", "num2"]
)
a = df[df['num2'].shift().ne(df['num2'].shift(-1))] # Erfan 's solution
b = df[~(df['num2'].eq(df['num2'].shift()) & df['num2'].eq(df['num2'].shift(-1)))]

print(a)
print(b)

输出:
# a
   num1  num2
0    12    10
2    13    10
3     1    26
4     2     7
5     3    26

# b
   num1  num2
0    12    10
2    13    10
3     1    26
5     3    26

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接