我想在包含以数字和符号开头的字符串作为唯一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.appl(lambda row: row['ID'][:9] if '.20_P' in row['ID'] else row['ID'], axis=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