首页 > 解决方案 > 基于特定行文本的 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,但在实际文件中它只有选项

转置逻辑在这里很复杂有什么帮助吗?在此处输入图像描述

'''

标签: pythonpandas

解决方案


您需要的不是换位,而是以熊猫措辞为中心。

我会:

  • 存储Question_Texts 以备将来使用
  • 将星号 ( *) 转移到Answer_Choice列中并将其清除MC
  • 向前填充MC以重复问题名称
  • NewQuestion在列中的选项后添加一个数字
  • 旋转数据框
  • 恢复Question_Texts

代码可以是:

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

推荐阅读