通过引用字符串位置检查数据框列中的子字符串

Posted

技术标签:

【中文标题】通过引用字符串位置检查数据框列中的子字符串【英文标题】:Check substring in dataframe column by referencing string position 【发布时间】:2020-11-08 20:57:54 【问题描述】:

我有一个数据框,其中有一个名为“id”的列,其中每个 id 的长度为 9 个字符,我正在尝试添加一个“评级”列,在该列中我根据是否将每一行评级为 A、AA 或 AAA第 6、7、8 个字符是“A00”、“AA0”或“000”。到目前为止,我有以下代码:

id = df['id']
conditions = [(id.str.get(5) == 'A00'), (id.str.get(5) == 'AA0'), (id.str.get(5) == '000')]
values = ['A', 'AA', 'AAA']
df['Rating'] = np.select(conditions, values)
df['Rating'] = df['Rating'].astype('category')

但我知道条件行是错误的,因为 column.str.get(n) 只检查字符串的第 (n-1) 个字符,我需要长度为 3 的子字符串,而不仅仅是单个字符。有谁知道我可以使用哪个命令?

提前致谢!

【问题讨论】:

如果你总是知道它在哪里,你可以做 id[5:8] - 5index to 8index ... 所以000 == AAA? @mac13k 是的,很抱歉造成混乱哈哈 【参考方案1】:

replace() 与值映射一起使用。:

df.id.str[-4:-1].replace('A00': 'A', 'AA0': 'AA', '000': 'AAA') 

【讨论】:

您好,感谢您的回复!当我使用它并打印出来时,我只得到一系列 NaN 值 - 你知道这是为什么吗? 我需要查看您的数据。当我在 id 列中有一个带有 ['A00', 'AA0', 'AAA'] 的数据框时,它对我有用。 但是我刚刚再次检查,它应该可以处理可变长度的字符串,因为无论如何只检查最后 3 个字符。 啊,我不想检查最后 3 个字符,而是最后一个字符之前的 3 个字符(如果有意义的话)?很抱歉造成混乱! 好的,所以你可以将get中的索引从[-3:]更改为`[-4:-1]'。还要确保你的 id 列中有 A,否则你会得到 NaN。【参考方案2】:

只需使用正则表达式提取它。

df.id.str.extract(r'.5([A]+)').fillna('AAA') 

例子

df = pd.DataFrame('id': ['12345A003', '12345AA03', '123450003']) 
df.id.str.extract(r'.5([A]+)').fillna('AAA')  

输出

     0
0    A
1   AA
2  AAA

【讨论】:

您好,感谢您的回复!当我使用它并打印出来时,我只得到一系列 NaN 值 - 你知道这是为什么吗? 你能打印你的 df['id'] 吗? 您好,刚刚看到您的编辑 - 不幸的是,我的 ID 号是 9 个字符而不是 8 个字符,我希望从不是最后 3 个字符,而是倒数第二个字符中获取字符串如果这是有道理的(所以不是第 7、第 8、第 9,而是第 6、第 7、第 8) 我刚刚用df['id']的图片编辑了帖子 它有 000 没有 A003、AA03 或 AAA3。如果你有条目,代码只是忽略前 5 个字符,它应该提取 A、AA、AAA 出来。

以上是关于通过引用字符串位置检查数据框列中的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何检查同一数据框列中的重复值并通过根据频率删除行来应用 if 条件?

检查数据框列中的所有值是不是相同

熊猫数据框列上的子字符串

Pyspark 通过使用另一列中的值替换 Spark 数据框列中的字符串

Pandas 通过子字符串匹配过滤数据框列

如何在其他四个数据框的列中检查一个数据框列是不是可用?