Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在dataframe列Python中查找和删除子字符串_Python_Pandas_Dataframe_Substring_Slice - Fatal编程技术网

在dataframe列Python中查找和删除子字符串

在dataframe列Python中查找和删除子字符串,python,pandas,dataframe,substring,slice,Python,Pandas,Dataframe,Substring,Slice,我想查找列中包含唯一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

我想查找列中包含唯一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

条件行是否应用于同一列:

df['ID']=df.apply(lambda行:行['ID'][:9]如果行['ID']中的'.20_P',否则行['ID'],轴=1)

对同一列应用条件行:

df['ID']=df.apply(lambda行:行['ID'][:9]如果行['ID']中的'.20_P',否则行['ID'],轴=1)

如果您知道要删除的字符串是添加了下划线的前缀,您可以这样做

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

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

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

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

这里的正则表达式的工作原理如下:查找由多个数字(
\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

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

这里的正则表达式的工作原理如下:查找由多个数字(
\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

谢谢你,但真正的身份证有几个“u”,但谢谢谢谢谢谢你,但真正的身份证有几个“u”,但谢谢你这很有效,谢谢你。您能解释lambda函数吗?lambda表达式根据同一行中的其他行设置字段“ID”的值。这正是您在问题中提出的逻辑,重新格式化为一行:
行['ID'][:9]如果['ID']行中的'.20\u P',否则行['ID']
这很有效,谢谢。您能解释lambda函数吗?lambda表达式根据同一行中的其他行设置字段“ID”的值。这正是您在问题中提出的逻辑,重新格式化为一行:
行['ID'][:9]如果.20_P'在行['ID']中,否则行['ID']
Series.str.extract()方法将比应用lambda快。
Series.str.extract()
方法将比应用lambda快。
Series.str.extract()
方法将比应用lambda快。
Series.str.extract()
方法将比应用lambda快。