首页 > 解决方案 > 如何将包含存储为文本和数字的值的 Pandas 列分成两个单独的列

问题描述

我有一个 Pandas 列,其中包含调查结果,这些结果可以是自由文本,也可以是 1-5 的数字。我正在从 JSON 格式的 API 中检索这些并将它们转换为 DataFrame。每行代表一个问题,参与者的答案如下:

Memberid | Question | Answer
       1   Q1             3
       1   Q2             2
       1   Q3         Test Text
       2   Q1             3
       2   Q2             2
       2   Q3         Test Text

具有结果的列现在将它们全部存储为字符串,因此在将它们导出到 excel 时,数字将存储为文本。

我的目标是为文本答案设置一个单独的列,并将原来的字段留空,以便我们为文本结果和数字结果设置单独的列以用于计算目的。

Memberid | Question | Numeric Answers | Freetext answers
       1   Q1             3
       1   Q2             2
       1   Q3                             Test Text
       2   Q1             3
       2   Q2             2
       2   Q3                             Test Text

我从这样的列表中生成这个df:

d = {'Memberid':memberid, 'Question':title, 'Answer':results}
df = pd.DataFrame(d)

所以我尝试的第一件事是通过以下方式将列中的数值从字符串转换为数字:

df["Answer"] = pd.to_numeric(df['Answer'], errors='ignore')

想法是,如果它有效,我可以简单地执行一个 for 循环来检查答案列中的值是否为字符串,然后将该值移动到新列中。

问题是,errors 命令不能按我的预期工作。当我忽略它时,没有任何东西被转换。当我将其更改为强制时,数字会从 str 转换为数字,但在 Excel 中,自由文本答案的字段现在为空。

标签: pythonpython-3.xpandas

解决方案


您可以使用Series.str.extract正则表达式模式:

  • (\d+)?将提取连续的数字
  • (\D+)将提取连续的非数字字符
  • ?P<text>语法将命名您的匹配组 - 使其成为列标题。

df.join(df.pop('Answer').str.extract('(?P<numbers>\d+)?(?P<text>\D+)?').fillna(''))

[出去]

   Memberid Question numbers       text
0         1       Q1       3           
1         1       Q2       2           
2         1       Q3          Test Text
3         2       Q1       3           
4         2       Q2       2           
5         2       Q3          Test Text

推荐阅读