我有一个包含一列 float 的数据框,如下所示(为简单起见,示例使用整数):
col1
0 10
1 10
2 5
3 5
4 5
5 10
6 4
7 4
8 4
9 4
10 4
11 5
12 5
我正在尝试创建一个新列,为每一行比较前一个和下一个与该行中的值不同的值,并根据它们是否相等分配一个 bool 值。例如,在 row[2] 中,值为 5,在 row[1] 中,前一个不同值(不是 5)是 10,下一个不同值是 10在行[5]中。在这种情况下,新列中的值将为 True
。
然后,对于示例 df,我试图获得的输出是
col1 col2
0 10 NaN
1 10 False
2 5 True
3 5 True
4 5 True
5 10 False
6 4 False
7 4 False
8 4 False
9 4 False
10 4 False
11 5 False
12 5 NaN
我知道如何与特定数量的前一行和后一行进行比较,但我不知道是否可以通过搜索“第一个不同值”进行比较。
有什么办法可以做到这一点吗?
非常感谢!
最佳答案
您可以使用一行中的唯一值来完成此操作,然后重新索引
,例如:
s = df['col1'] #to ease the code
#where the value is not the same as before
m = s.diff().ne(0)
# unique value if following
su = s[m].reset_index(drop=True)
print (su)
# 0 10
# 1 5
# 2 10
# 3 4
# 4 5
# Name: col1, dtype: int64
#create columns in df to align previous and after not equal value
df['col1_after'] = su.reindex(m.cumsum().values).values
df['col1_before'] = su.reindex(m.cumsum().values-2).values
#create col2 where the two previous columns are equal
df['col2'] = df['col1_after'].eq(df['col1_before'])
你会得到
print (df)
col1 col1_after col1_before col2
0 10 5.0 NaN False
1 10 5.0 NaN False
2 5 10.0 10.0 True
3 5 10.0 10.0 True
4 5 10.0 10.0 True
5 10 4.0 5.0 False
6 4 5.0 10.0 False
7 4 5.0 10.0 False
8 4 5.0 10.0 False
9 4 5.0 10.0 False
10 4 5.0 10.0 False
11 5 NaN 4.0 False
12 5 NaN 4.0 False
请注意,您可以执行 df.drop(['col1_after','col1_before'], axis=1)
删除不需要的列,我将它们留在这里以显示发生的情况
关于python - 比较 Pandas 列中的上一个和下一个不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62179299/