python - 如何将包含存储为文本和数字的值的 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 中,自由文本答案的字段现在为空。
解决方案
您可以使用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
推荐阅读
- visual-studio - VS 2019 的 x64 本机工具命令提示符不起作用
- java - 实际对象和对所述对象的引用之间的区别何时变得重要?-Java
- node.js - Vue.js 庞大的 node_modules (初学者问题)
- c++ - C++ 丢失参考
- c - 复杂结构的哈希
- google-sheets - 使用 INSERTED 行 NOT OVERWRITE 将两个表合并为一个
- java - 如何在 Firestore 中获取文档中的集合数量?
- python - 我有一个数据框,是否可以获得一个矩阵,其中行作为水果的名称,值作为该水果的频率?
- react-router - 解决 Auth0 示例要求以将历史记录添加到反应路由器
- javascript - 如何传递2个参数并返回最近对象的第三个参数