从字符串列中提取数字

时间:2019-11-18 09:38:32

标签: python pandas

我有多个列名标题,我想从存在这样一个数字的每个列中提取一个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))

因此,仅当该列没有字符串nan时,我才想使用6位数字并将其放置在名为global_id的列中。

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

  

ValueError:系列的真值不明确。使用空   a.bool(),a.item(),a.any()或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
     ... 

2 个答案:

答案 0 :(得分:4)

使用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

答案 1 :(得分:2)

您还可以使用stackmerge

df = pd.DataFrame(d)

s = df.stack().str.extract(r"(\d{6})").unstack().bfill(axis=1).iloc[:, 0]

print (df.merge(s,how="left",left_index=True,right_index=True))

#

                                                 titles1 titles2                                            titles3 titles4 titles5                                            titles6 (0, titles1)
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