python - 将字符串与前一行和连续行进行比较以检查是否按字母顺序
问题描述
我需要检查数据框中的列是否按字母顺序仅比较两个相邻的值。
编号 | 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:因为我有其他列,我需要保持当前行顺序的数据。
解决方案
一个想法Series.rank
and 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
推荐阅读
- c# - JSON模型的多重继承的替代方案?
- laravel - 动态字段验证 (Livewire) - 有效但不能引用错误桶
- r - 为什么在 R 中总结线性模型并没有显示所有需要的级别?
- hash - 什么是多编解码器以及它与多哈希有何关系?
- python - Pandas 数据框 concat 函数创建两行
- ruby - 加载资产以在 Ruby 中查看
- ruby-on-rails - 在每个循环中渲染 simple_form,rails 6
- python - 无法在单独的方法中同时打印三个字段
- node.js - 使用 docx4js 从 docx 访问内容控件
- docker - nginx 容器中的 proxy_pass