Tim*_*Tim 4 python python-3.x 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
Run Code Online (Sandbox Code Playgroud)
包含结果的列现在将所有结果存储为字符串,因此,将结果导出为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
Run Code Online (Sandbox Code Playgroud)
我从这样的列表生成此df:
d = {'Memberid':memberid, 'Question':title, 'Answer':results}
df = pd.DataFrame(d)
Run Code Online (Sandbox Code Playgroud)
因此,我尝试的第一件事是通过以下方式将列中的数值从字符串转换为数字:
df["Answer"] = pd.to_numeric(df['Answer'], errors='ignore')
想法是,如果可行,我可以简单地执行for循环,以检查答案列中的值是否为字符串,然后将该值移至新列中。
问题是,错误命令无法按我的预期运行。当我将其保留为ignore时,没有任何转换。当我将其更改为强制时,数字从str转换为数字,但是其中自由文本答案的字段现在在Excel中为空。
您可以使用Series.str.extract正则表达式模式:
(\d+)? 将提取连续的数字(\D+) 将提取连续的非数字字符?P<text>语法将命名匹配组-使这列标题。df.join(df.pop('Answer').str.extract('(?P<numbers>\d+)?(?P<text>\D+)?').fillna(''))
Run Code Online (Sandbox Code Playgroud)
[出]
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
Run Code Online (Sandbox Code Playgroud)