Python:如何比较同一行和下一行列中的值?

Python: How to compare values in columns in the same row and in the next row?

提问人:Andrei 提问时间:3/16/2023 更新时间:3/16/2023 访问量:157

问:

我有以下数据帧:

Column A    Column B    Column C
LONDON      MADRID      LONDON
LONDON      MADRID      LONDON
LONDON      MADRID      LONDON
LONDON      MADRID      MADRID
LONDON      MADRID      MADRID
LONDON      MADRID      MADRID
ROME        HAMBURG     ROME
ROME        HAMBURG     HAMBURG
ROME        HAMBURG     HAMBURG
ROME        HAMBURG     HAMBURG
LONDON      MADRID      LONDON
LONDON      MADRID      LONDON
LONDON      MADRID      MADRID
LONDON      MADRID      MADRID

我想应用逻辑:如果 A 列中的值等于 C 列中同一行中的值,并且 B 列中的值等于 C 列下一行中的值,则返回这两行。预期结果是:

Column A    Column B    Column C
LONDON      MADRID      LONDON
LONDON      MADRID      MADRID
ROME        HAMBURG     ROME
ROME        HAMBURG     HAMBURG
LONDON      MADRID      LONDON
LONDON      MADRID      MADRID

这感觉很简单,但我无法控制。非常感谢任何帮助。

pandas if-语句 迭代 比较

评论


答:

3赞 jezrael 3/16/2023 #1

您可以先使用 for bitwise AND 按条件测试行,然后在布尔索引中按位链接 shift mask by:&|OR

m = df['Column A'].eq(df['Column C']) & df['Column B'].eq(df['Column C'].shift(-1))

df = df[ m | m.shift(fill_value=False)]
print (df)
   Column A Column B Column C
2    LONDON   MADRID   LONDON
3    LONDON   MADRID   MADRID
6      ROME  HAMBURG     ROME
7      ROME  HAMBURG  HAMBURG
11   LONDON   MADRID   LONDON
12   LONDON   MADRID   MADRID
0赞 Viktor Reichert 3/16/2023 #2

您可以使用 DataFrame.shift 方法获得所需的输出:

# Prepare DataFrame
L = ['London']
R = ['Rome']
M = ['Madrid']
H = ['Hamburg']

df = pd.DataFrame({'A': 6*L+4*R+4*L, \
                   'B': 6*M+4*H+4*M, \
                   'C': 3*L+3*M+R+3*H+2*L+2*M})

# Calculation:
indices = df.join(df.shift(-1).C.rename('D')) \
            .query('A == C & B == D') \
            .index

# Get Output
df.iloc[indices | indices + 1]