在数据框中搜索字符串并将找到的数字加1



我有一个手工创建的数据框架。我正在编写一个代码,该代码复制数据框并将新数据框连接到第一个数据框的末尾。现在,我需要代码来查看包含字符串的'Name'数据框的列的每个值,如果字符串中有一个数字,则将该数字增加1。我需要将数字转换为int,这样我就可以创建一个函数,该函数将查看数据框并自动将数据框中最大的数字加1。一个例子:

import pandas as pd
data = {'ID': [1,2,3,4],
'Name': ['BN #1', 'HHC', 'A comp', 'B Comp']}
df = pd.DataFrame(data)
df['SysNum'] = [int(re.search('(?<=#)d', x)[0]) for x in df['Name'].values]

之后新的df看起来像

data2 = {'ID': [1,2,3,4,5,6,7,8],
'Name': ['BN #1', 'HHC', 'A comp', 'B Comp','BN #2', 'HHC', 'A comp', 'B Comp']} 

当我运行这个,我收到一个'NoneType'对象是不可下标错误。这是有意义的,因为只有bn#行有一个数字,当字符串参数不满足时,re.search返回None,但我不知道如何告诉python忽略其他行。

编辑每个数据帧只有第一行会增加1,所以如果有一种更简单的方法,我不使用re.search,那就好了。我知道有几种方法可以做到这一点,但我希望能够始终查看BN的字符串值,并在每次运行代码时将其增加1。

REGEX编辑

df2['BaseName'] = [re.sub('d', '', x) for x in df2['Name'].values]
df['BaseName'] = [re.sub('d', '', x) for x in df['Name'].values]
df2['SysNum'] = [int(re.search('(?<=#)d', x)[0]) for x in df2['Name'].values]
# df2['SysNum'] = df2['Name'].get(r'(?<=#)d').astype(int)
# df['SysNum'] = [int(re.search('(?<=#)d', x)[0]) for x in df['Name'].values]
df['SysNum'] = df['Name'].str.contains('(?<=#)d').astype(int)

m =  re.search(r'(?<=#)d', df2['Name'].iloc[0])
if m:
df2['SysNum'] = int(m.group(0)) + 1

n = re.search(r'(?<=#)d', df['Name'].iloc[0])
if n:
df['SysNum'] = int(n.group(1)) + 1


new_names = df2['BaseName'].unique()
maxes2 = np.zeros((len(new_names), ))

for j in range(len(new_names)):
un2 = new_names[j]
maxes2[j] = df['SysNum'].loc[df['BaseName'] == un2].max()
df2['SysNum'].loc[df2['BaseName'] == un2] = np.linspace(1, len(df2['SysNum'].loc[df2['BaseName'] == un2]), len(df2['SysNum'].loc[df2['BaseName'] == un2]))
df2['SysNum'].loc[df2['BaseName'] == un2] += maxes2[j]
newnames2 = [s + '%d' % num for s,num in zip(df2['BaseName'].loc[df2['BaseName'] == un2].values, df2['SysNum'].loc[df2['BaseName'] == un2].values)]
df2['Name'].loc[df2['BaseName'] == un2] = newnames2

我让这段代码为两个数据帧工作,编号按我想要的方式工作。前两个有一个"名称-###"数据框中所有行的命名约定。这使得顶部注释掉的research .search行可以正常运行。我正在处理的接下来两个数据框架就像我之前提到的bn# 1的例子一样,其余的名称没有数字。当我运行注释掉的research .search行时,代码试图将NoneTypes转换为int,但它不能这样做。当我像现在这样运行代码时,在名称后面的每一行上都添加了一个新数字,但是我需要它向带有#的行添加一个新数字。所以我需要的,我正在努力的是一段代码,通过数据框,寻找一个#符号,把#符号后面的数字变成一个int,一个循环,寻找最大的int,然后加1到这个数字,把这个新数字加到新的数据框,把新的数据框加到旧的一个更大的主列表。

您可以使用df['Name'].iloc[0]访问Name列第一行的值。

因此,您可以使用

在该值中搜索#符号后的数字序列
m =  re.search(r'#(d+)', df['Name'].iloc[0])
if m:
df['SysNum'] = int(m.group(1)) + 1

输出:

>>> df
ID    Name  SysNum
0   1   BN #1       2
1   2     HHC       2
2   3  A comp       2
3   4  B Comp       2

相关内容

最新更新