python - 从字符串列中提取数字
问题描述
我有多个列名称标题,我想从每个存在这样的数字的列中提取一个 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:Series 的真值不明确。使用 a.empty、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
...
解决方案
使用 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
推荐阅读
- sql-server - SQL Server 中的模式查找和替换
- c# - 如何在 Visual Studio 单文件生成器中签出 TFS 中的文件?
- c# - 为什么要从接口创建新对象?
- curl - 通过 cURL 获取访问令牌
- rust - 实现可在不同所有权类型上重用的通用代码的最佳实践是什么:&'a T 或 Box
, 或? - c++ - 如何检查所有随机数组元素是否不同
- r - 函数和 Cbind 结果的多个变量值
- python - 在一个 Jupyter Notebook 单元中播放多种声音
- excel - 合并和中心值的 VLookup 存在问题
- matlab-figure - Matlab:来自`text()`的文本底部被切碎