从列中提取数字并将其分成单独的列

时间:2019-11-26 14:20:11

标签: python pandas

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

1 个答案:

答案 0 :(得分:0)

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]