python - 从列中提取数字并将每个拆分为单独的列
问题描述
我想从给定的一组列中迭代地过滤掉数字。每列最多应该有6个数字。
然后,我想将这些列中的每一列分成 6 个单独的列,每列包含一个从提取的 6 个数字中提取的数字。
我试图通过用从该列中提取的数字替换感兴趣的列中的所有字符串并使用 for 循环将每一列拆分为 6 个单独的列来做到这一点:
judge_cols = ['JudgeID'+str(i) for i in range(1,85)]
num = lambda x: re.search('\d+',x).group()
for i in judge_cols:
data[i].replace('\D+',' ',regex=True,inplace=True)
data[['Judge1BoxerScore'+num(i),'Judge1OppScore'+num(i),
'Judge2BoxerScore'+num(i),'Judge2OppScore'+num(i),
'Judge3BoxerScore'+num(i),'Judge3OppScore'+num(i)]] = data[i].str.split(' ',6,expand=True).drop(columns=[0])
然而,问题是这会返回错误:
ValueError: Columns must be same length as key
我试图通过从每个拆分中删除第零列来确保列的长度相同。我注意到,当我将单列拆分为 6 列时,总是第 0 列不包含任何内容。但是,在这种情况下,这似乎没有帮助。
这是我的数据示例:
{'JudgeID1': {0: "['[]', '[]', '[]']",
1: '[]',
2: "['[]', '[]', '[]']",
3: "['[38 38]', '[37 39]', '[38 38]']",
4: "['[]', '[]', '[]']",
5: '[]',
6: "['[]', '[]', '[]']"},
'JudgeID2': {0: "['[]', '[]', '[]']",
1: "['[]', '[]', '[]']",
2: "['[]', '[]', '[]']",
3: "['[37 37]', '[38 36]', '[38 36]']",
4: "['[]', '[]', '[]']",
5: '[]',
6: "['[]', '[]', '[]']"}}
此示例的预期输出将类似于以下内容:
A1 B1 C1 D1 E1 F1 A2 B2 C2 D2 E2 F2
0
1
2
3 38 38 37 39 38 38 37 37 38 36 38 36
4
5
6
解决方案
IIUC,你可以stack
,extractall
然后unstack
。最后,我们将通过修复列名来进行一些清理:
df_out = (df.stack()
.str.extractall(r'(\b\d+\b)')
.unstack([1, 2])
.droplevel(0, axis=1)
.sort_index(axis=1)
.reindex(df.index))
df_out.columns = [f'{j}Boxer{i+1}' if i % 2 == 0 else f'{j}Opp{i+1}'
for j, i in df_out.columns]
推荐阅读
- c# - 我需要从形成列表的控制台输入中删除空格
- javascript - 跨域 AJAX 得到响应,但在错误消息中
- go - 使用 Websocket 向客户端广播服务器端消息
- python - 临时目录中的临时文件
- angular - Ionic cordova run [platform] –prod –release throws typescript error 无法写入文件错误
- django - `TemplateDoesNotExist` 错误,虽然它确实存在
- swift - instanceViewController 上的信号 SIGABRT
- postgresql - 在 postgreSQL 中安装扩展模块后提取表名?
- google-bigquery - BigQuery 连接对于小尺寸表来说太慢了
- node.js - 类型错误:arr[idx] 不是函数