提问人:Andrei 提问时间:3/16/2023 更新时间:3/16/2023 访问量:157
Python:如何比较同一行和下一行列中的值?
Python: How to compare values in columns in the same row and in the next row?
问:
我有以下数据帧:
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
这感觉很简单,但我无法控制。非常感谢任何帮助。
答:
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]
评论