Skip to main content
 首页 » 编程设计

python之从字符串列中提取数字

2025年05月04日27小虾米

我有多个列名标题,我想从每个存在这样一个数字的列中提取一个 6 位数字,并将这些数字放在一个新的列名 global_id 中。一些标题列是空的,或者更确切地说是 nan 作为字符串。

这是我到目前为止写的:

def titles_split(df,col): 
    df[col] = df[col].astype('str') 
    return df[col].str.extract('(\d{6})') 
for i in range(1,75): 
    if (df_split['titles'+str(i)] == 'nan') == False: 
        df_split['global_id'] = titles_split(df_split,'titles'+str(i)) 

所以我想取 6 位数字并将其放在列名 global_id 中,仅当该列不包含字符串 nan 时。

但是,这会返回以下错误消息:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

这是我的数据示例:

        {'titles1': {0: 'nan', 
  1: 'nan', 
  2: 'nan', 
  3: 'nan', 
  4: ':[]}] 3/16/2019 lightweight 870590 FALSE nan Cristopher di Girolamo Italy 1 [["career"         \\n        \\n2019-2019\\n]] /build/images/main/avatar.jpeg [[1153 2] [21 29]] 98 nan Miami  Flor'}, 
 'titles2': {0: 'nan', 1: 'nan', 2: 'nan', 3: 'nan', 4: 'nan'}, 
 'titles3': {0: 'nan', 
  1: ':[]}] 2/13/2016 cruiserweight 746272 FALSE nan Alvin Davie USA 3 [["career"         \\n        \\n2016-2019\\n]] /build/images/main/avatar.jpeg [[555 1140] [110 226]] 98 nan Miami  Flor', 
  2: 'nan', 
  3: 'nan', 
  4: 'nan'}, 
 'titles4': {0: 'nan', 1: 'nan', 2: 'nan', 3: 'nan', 4: 'nan'}, 
 'titles5': {0: 'nan', 1: 'nan', 2: 'nan', 3: 'nan', 4: 'nan'}, 
 'titles6': {0: ':[]}] 10/10/2015 heavyweight 734308 FALSE [6 2 188] Joseph White USA 6 [["career"         \\n        \\n2015-2019\\n]] https://boxrec.com/media/images/thumb/9/9c/734308.jpeg/200px-734308.jpeg [[679 1311] [180 350]] 98 nan Miami  Flor', 
  1: 'nan', 
  2: ':[]}] 2/24/2018 heavyweight 827050 FALSE [6 4 193] Anthony Martinez USA 6 [["career"         \\n        \\n2018-2019\\n]] https://boxrec.com/media/images/thumb/c/cb/AnthonyMartinez.jpg/200px-AnthonyMartinez.jpg [[648 1311] [171 350]] 98 [78 198] Miami  Flor', 
  3: 'nan', 
  4: 'nan'}} 

更新:

我设法通过将 == 替换为“is”来消除初始错误,但现在的问题是我为新的 global_id 列中的所有行获取了 nan 值。

这就是我现在做的

def titles_split(df,col): 
    return df[col].str.extractall('(\d{6})') 
for i in range(1,75): 
    if (df_split['titles'+str(i)] == 'nan') is False: 
        df_split['global_id'] = titles_split(df_split,'titles'+str(i)) 

这是 global_id 列的输出:

0     NaN 
1     NaN 
2     NaN 
3     NaN 
4     NaN 
     ...  

请您参考如下方法:

使用 pandas str 函数:

df['global_id'] = df.loc[:, df.columns].apply(str, axis=1).str.extract(r'.*(\d{6})') 
df 
 
titles1     titles2     titles3     titles4     titles5     titles6     global_id 
0   nan     nan     nan     nan     nan     :[]}] 10/10/2015 heavyweight 734308 FALSE [6 2...   734308 
1   nan     nan     :[]}] 2/13/2016 cruiserweight 746272 FALSE nan...   nan     nan     nan     746272 
2   nan     nan     nan     nan     nan     :[]}] 2/24/2018 heavyweight 827050 FALSE [6 4 ...   827050 
3   nan     nan     nan     nan     nan     nan     NaN 
4   :[]}] 3/16/2019 lightweight 870590 FALSE nan C...   nan     nan     nan     nan     nan     870590