我想迭代地过滤掉一组给定列中的数字。每列最多应有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
答案 0 :(得分:0)
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]