在dataframe列Python中查找和删除子字符串
我想查找列中包含唯一ID的所有行,该ID是以数字和符号开头的字符串。在识别它们之后,我只想删除那些唯一行的前9个字符。到目前为止,我已经:在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
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快。