我有一个手工创建的数据帧。我正在编写一段复制数据帧并将新数据帧连接到第一个数据帧末尾的代码。现在,我需要代码来查找包含字符串的'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我让这段代码为两个数据帧工作,并且编号按照我想要的方式工作。前两个对数据帧中的所有行都有一个“Name-#”命名约定。这允许顶部注释掉的re.search行运行得很好。我正在处理的接下来的两个数据帧类似于我之前使用BN #1提供的示例,其余的名称没有数字。当我运行注释掉的整型行时,代码试图将NoneTypes转换为re.search,但它无法做到。当我像现在一样运行代码时,紧跟在名称后面的每一行都会有一个新的数字,但我需要它来向带有#的行添加一个新的数字。所以我需要的,也是我正在努力的是一段代码,它浏览数据帧,查找#符号,将#符号后的数字转换为int,一个循环,查找最大int,然后将该数字加1,将新数字添加到新的dataframe上,将新的dataframe添加到旧数据帧上以获得更大的主列表。
发布于 2021-10-18 20:58:19
您可以使用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 2https://stackoverflow.com/questions/69621775
复制相似问题