将单元格值与同一列中下面的单元格值进行比较?

Sha*_*anu 1 python pandas

我有一个包含以下列的数据框

import pandas as pd

df = pd.DataFrame({'num': [1, 2, 2, 3, 4, 5, 6]})
Run Code Online (Sandbox Code Playgroud)

我想创建一个列,用于df['num'].shift()将当前单元格值与其下方的单元格值进行比较,如果匹配,则该值应为 True 或 False。

预期输出:

   num  matches?
0    1     False
1    2      True
2    2     False
3    3     False
4    4     False
5    5     False
6    6     False
Run Code Online (Sandbox Code Playgroud)

我无法找到迭代每个单元格并比较条件以及当我使用以下内容时的最佳方法:

df['matches?'] = ''

for i in range(len(df)):
    if df['num'] == df['num'].shift(1):
        df['matches?'] = True
    else:
        df['matches?'] = False
Run Code Online (Sandbox Code Playgroud)
import pandas as pd

df = pd.DataFrame({'num': [1, 2, 2, 3, 4, 5, 6]})
Run Code Online (Sandbox Code Playgroud)

如何以最简单的方式实现这一目标?

cal*_*ini 5

当您使用时shift,不需要循环,该操作将被矢量化并为您完成:

df['matches?'] = df['num'].shift(-1)==df['num']
Run Code Online (Sandbox Code Playgroud)

输出:

    num    matches?
0   1      False
1   2      True
2   2      False
3   3      False
4   4      False
5   5      False
6   6      False
Run Code Online (Sandbox Code Playgroud)

编辑

如果你想保留循环逻辑:

for ix, row in df.iterrows():
    if ix < len(df)-1:
        if df.loc[ix, 'num'] == df.loc[ix+1, 'num']:
            df.loc[ix, 'matches?'] = True
        else:
            df.loc[ix, 'matches?'] = False
    else: #last observation
        df.loc[ix, 'matches?'] = False
Run Code Online (Sandbox Code Playgroud)

输出:

    num    matches?
0   1      False
1   2      True
2   2      False
3   3      False
4   4      False
5   5      False
6   6      False
Run Code Online (Sandbox Code Playgroud)