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

bwleehnv  于 2023-09-29  发布在  其他
关注(0)|答案(4)|浏览(115)

我有一个包含以下列的 Dataframe

import pandas as pd

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

我想创建一个列,它使用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

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

df['matches?'] = ''

for i in range(len(df)):
    if df['num'] == df['num'].shift(1):
        df['matches?'] = True
    else:
        df['matches?'] = False
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

如何以最简单的方式做到这一点?

6ojccjat

6ojccjat1#

当你使用shift时,你不需要循环,操作是向量化的,并为你做:

df['matches?'] = df['num'].shift(-1)==df['num']

输出:

num    matches?
0   1      False
1   2      True
2   2      False
3   3      False
4   4      False
5   5      False
6   6      False

编辑

如果你想保持循环逻辑:

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

输出:

num    matches?
0   1      False
1   2      True
2   2      False
3   3      False
4   4      False
5   5      False
6   6      False
e7arh2l6

e7arh2l62#

当您处理数值时,可以使用diff在两行之间进行计算,请参阅下面的代码

df['matches?'] = df['num'].diff(-1).eq(0)  #eq means equal to
1aaf6o9v

1aaf6o9v3#

保持for循环不变。你可以试试这个

i=0
for i in range(0,len(df)-1):
    if df['num'][i] == df['num'][i+1]:
        df['matches?'][i] = "T"
    else:
        df['matches?'][i] = "F"

您应该遍历len(df)-1,因为当循环到达最后一行时,在它之后将没有什么可比较的。它会在那里抛出索引错误。

输出

+-----+----------+
| num | matches? |
+-----+----------+
|   1 | F        |
|   2 | T        |
|   2 | F        |
|   3 | F        |
|   4 | F        |
|   5 | F        |
|   6 | F        |
+-----+----------+
watbbzwu

watbbzwu4#

您也可以添加elif和实现打破逻辑3节如下所述

df['matches?'] = ''

for i in range(0,len(df['num'])):
    if i+1==len(df['num']):
       df['matches?'][i] = False
    elif df['num'][i] == df['num'][i+1]:
       df['matches?'][i] = True
    else:
       df['matches?'][i] = False

相关问题