python - 基于特定行文本的 Python Pandas Pivot
问题描述
''' 我有这样的记录
MC NewQuestion Answer_Choice
Question: Question A ? Question_Text No_HTML
Option Option A
* Option Option B
Questoin:Question B ? Question_Text No_HTML
* Option Option A
Option Option B
Option Option C
我多么想要!
MC New_Question Option Option Option
Question: Question A ? Question_Text Option A *Option B
Question: Question B ? Question_Text *Option A Option B Option C
我们可以将选项列重命名为 1,2,3,但在实际文件中它只有选项
转置逻辑在这里很复杂有什么帮助吗?在此处输入图像描述
'''
解决方案
您需要的不是换位,而是以熊猫措辞为中心。
我会:
- 存储
Question_Text
s 以备将来使用 - 将星号 (
*
) 转移到Answer_Choice
列中并将其清除MC
- 向前填充列
MC
以重复问题名称 NewQuestion
在列中的选项后添加一个数字- 旋转数据框
- 恢复
Question_Text
s
代码可以是:
nq = df.loc[df['MC'].str.startswith('Question'), ['MC', 'NewQuestion']
].set_index('MC')
df.loc[df['MC'] == r'*', 'Answer_Choice'] = df['MC'] + df['Answer_Choice']
df.loc[~df['MC'].str.startswith('Question'), 'MC'] = np.nan
df = df.ffill().loc[df['NewQuestion'] == 'Option']
df['NewQuestion'] = df['NewQuestion'] + ' ' + (df.groupby('MC').cumcount()+1).astype(str)
df = df.pivot('MC', 'NewQuestion', 'Answer_Choice'
).rename_axis(None, axis=1).fillna('') \
.assign(NewQuestion = nq['NewQuestion']).reset_index()
df = df[['MC', 'NewQuestion'] + df.columns.tolist()[1:-1]]
使用您的示例数据,我得到:
MC NewQuestion Option 1 Option 2 Option 3
0 Question: Question A ? Question_Text Option A *Option B
1 Question: Question B ? QuestionB_Text *Option A Option B Option C
推荐阅读
- html - 从 django 模型表单中删除字段会破坏 HTML 中的格式
- r - 如何在 ggplot2 中创建具有多个计数变量的线图?
- r - 如何使用带有数据框的 dplyr 在 R 中创建百分位数?
- amazon-web-services - 如何从jenkins管道将命令行参数传递给aws beanstalk中的jar?
- nuget - nuget.exe 忽略 packageSourceCredentials 的继承
- c# - 如何更改此代码以查找具有特定标签而不是特定对象的对象的转换?
- android - 使用 app:srcCompat android MaterialButton 而不是 app:icon 时图标未显示
- reactjs - 反应上传功能不显示/上传文件内容(antd/AntDesign)
- asp.net-core - 在 Jenkins(BlueOcean) 管道中发布 cobertura 代码覆盖率结果
- css - 仅当父级宽度不足时才允许水平重叠 div