【问题标题】:Finding and deleting sub-strings in dataframe column Python在数据框列 Python 中查找和删除子字符串
【发布时间】:2020-05-26 04:08:02
【问题描述】:

我想在包含唯一 ID 的列中查找所有行,该 ID 作为以数字和符号开头的字符串。在确定它们之后,我只想删除那些唯一行的前 9 个字符。到目前为止,我有:

if '.20_P' in df['ID']:
     df['ID']= df['ID']str.slice[: 9]

我希望它把这个放在哪里:

df['ID'] = 
2.2.2020_P18dhwys
2.1.2020_P18dh234
2.4.2020_P18dh229
P18dh209
P18dh219
2.5.2020_P18dh289

把它变成这样:

df['ID'] = 
P18dhwys
P18dh234
P18dh229
P18dh209
P18dh219
P18dh289

【问题讨论】:

  • Series.str.extract() 方法将比应用 lambda 更快。

标签: python pandas dataframe substring slice


【解决方案1】:

对同一列进行有条件的逐行应用:

df['ID'] = df.apply(lambda row: row['ID'][:9] if '.20_P' in row['ID'] else row['ID'], axis=1)

【讨论】:

  • 这行得通,谢谢。你能解释一下 lambda 函数以及它在做什么吗?
  • lambda 表达式根据同一行中的其他行设置字段“ID”的值。这只是您在问题中提出的逻辑,重新格式化为一行:row['ID'][:9] if '.20_P' in row['ID'] else row['ID']
【解决方案2】:

您还可以使用正则表达式来查找子字符串。

这里的正则表达式的工作原理如下:找到一个子字符串(),该子字符串由数字(\d)或([])非空白字符(\w)的多次出现(+)组成。这可能 (*, ?) 前面是数字和点 [\d+\.] 的组合,后面带有下划线 _。请注意,这也非常快,因为它经过了高度优化(与 .apply() 相比)。因此,如果您有大量数据,或者经常这样做,您可能需要考虑这一点。

import pandas as pd

df = pd.DataFrame({'A': [
    '2.2.2020_P18dhwys',
    '2.1.2020_P18dh234',
    '2.4.2020_P18dh229',
    'P18dh209',
    'P18dh219',
    '2.5.2020_P18dh289',
]})

print(df['A'].str.extract(r'[\d+\.]*_?([\d\w]+)'))

输出:

          0
0  P18dhwys
1  P18dh234
2  P18dh229
3  P18dh209
4  P18dh219
5  P18dh289

【讨论】:

  • Series.str.extract() 方法将比应用 lambda 更快。
【解决方案3】:

如果你知道要删除的字符串是一个带下划线的前缀,你可以这样做

 df['ID']= df['ID'].apply(lambda x: x.split('_')[-1])

【讨论】:

  • 谢谢你,但真实的ID有几个'_',但谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 2014-06-19
  • 2022-01-05
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多