首页 > 解决方案 > 将字符串与前一行和连续行进行比较以检查是否按字母顺序

问题描述

我需要检查数据框中的列是否按字母顺序仅比较两个相邻的值。

编号 Col1
0 一个
1 一个
2
3 一个
4 一个
5
6
7 C

或者:

import pandas as pd
df = pd.DataFrame(['A','A','B','A','A','B','B','C'], columns=['Col1'])

现在只有第 2 行出现故障。

我想做类似的事情:

df['InOrder'] = df['Col1'].rolling(2).apply(lambda x: x[0] >= x[1] >= x[2])

但滚动仅适用于数值。

我也试过:

df['InOrder'] = df['Col1'] >= df['Col1'].shift(1) >= df['Col1'].shift(2)

但我明白了

Series 的真值是模棱两可的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

这是我期望得到的:

编号 Col1 为了
0 一个 真的
1 一个 真的
2 错误的
3 一个 真的
4 一个 真的
5 真的
6 真的
7 C 真的

PS:因为我有其他列,我需要保持当前行顺序的数据。

标签: pythonpandas

解决方案


一个想法Series.rankand np.diff,替换缺失值和比较Series.ge为大或等于:

df['InOrder'] = df['Col1'].rank(method='dense').rolling(2).apply(lambda x: np.diff(x)).fillna(0).ge(0)

或类似@wwnde 解决方案:

df['InOrder'] = df['Col1'].rank(method='dense').diff().fillna(0).ge(0)

print (df)
  Col1  InOrder
0    A     True
1    A     True
2    B     True
3    C     True
4    B    False
5    D     True
6    D     True
7    E     True

编辑:如果需要匹配最多 1 个值,可以使用:

df['InOrder'] = df['Col1'].rank(method='dense').diff().shift(-1).fillna(0).isin([0,1])
print (df)
  Col1  InOrder
0    A     True
1    A     True
2    B    False
3    A     True
4    A     True
5    B     True
6    B     True
7    C     True

df['InOrder'] = df['Col1'].rank(method='dense').diff(-1).fillna(0).isin([0,-1])
print (df)
      Col1  InOrder
0    A     True
1    A     True
2    B    False
3    A     True
4    A     True
5    B     True
6    B     True
7    C     True

推荐阅读