【问题标题】:Extracting digits from column and splitting each into separate column从列中提取数字并将每个数字拆分为单独的列
【发布时间】:2019-11-26 14:20:11
【问题描述】:

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

【问题讨论】:

  • 你的预期输出是什么?
  • @ChrisA 我添加了一个我想要的输出示例
  • df['JudgeID5'].str.extractall(r'(\b\d+\b)').unstack().reindex(df.index) ..?
  • @ChrisA 谢谢。我只以JudgeID5 为例。问题是当我尝试对数据集中的所有列执行此操作时
  • @ChrisA 更新了样本数据和预期输出

标签: python pandas


【解决方案1】:

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-19
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多