首页 > 解决方案 > 从列中提取数字并将每个拆分为单独的列

问题描述

我想从给定的一组列中迭代地过滤掉数字。每列最多应该有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         

标签: pythonpandas

解决方案


IIUC,你可以stackextractall然后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]

推荐阅读