Python 重新构造dataframe(可能是pivot或unpivot),使每列显示基于0'的数据标签;s和1';s

Python 重新构造dataframe(可能是pivot或unpivot),使每列显示基于0'的数据标签;s和1';s,python,pandas,dataframe,pivot,transform,Python,Pandas,Dataframe,Pivot,Transform,我有调查数据。调查提出一个问题,受访者为每个问题选择一个或多个给定类别。然后,调查询问了诸如性别等人口统计问题。输出是一个数据框,人口统计信息作为列,每个问题中每个类别的矩阵为0和1(0=未选择,1=已选择) 为了帮助您更好地理解这一点,我提供了以下数据框: df = pd.DataFrame({'Survey ID': [1,2,3], 'Q1_Topic A': [0,1,1], 'Q1_Topic B': [1,

我有调查数据。调查提出一个问题,受访者为每个问题选择一个或多个给定类别。然后,调查询问了诸如性别等人口统计问题。输出是一个数据框,人口统计信息作为列,每个问题中每个类别的矩阵为0和1(0=未选择,1=已选择)

为了帮助您更好地理解这一点,我提供了以下数据框:

df = pd.DataFrame({'Survey ID': [1,2,3],
                   'Q1_Topic A': [0,1,1], 
                   'Q1_Topic B': [1,0,1], 
                   'Q1_Topic C': [1,0,0],
                   'Q2_Topic X': [0,0,1], 
                   'Q2_Topic Y': [0,1,0], 
                   'Q2_Topic Z': [0,0,1],
                   'Gender': ['Male', 'Female', 'Male']
                  })
print(df)
我需要转换这个数据框,根据选择的类别,为每个问题显示一列,为每个调查显示多行。每行在相关问题列下应有一个类别

困惑了吗?这很难解释,但数据应该是

df2 = pd.DataFrame({'Survey ID': [1,1,2,3,3],
                   'Q1': ['B','C','A','A','B'], 
                   'Q2': [float('nan'), float('nan'), 'Y', 'X', 'Z'],
                   'Gender': ['Male', 'Male', 'Female', 'Male', 'Male']
                    })
print(df2)
基本上我需要将df转换为df2。 注意:每个列标签的问题和主题都有一个公共分隔符“\u1”


一如既往,非常感谢您在高级课程中的帮助。如果没有这个社区,我有时会陷入困境,通过这个平台我学到了很多东西。

这段代码怎么样?这不是花哨的代码,而是直观的

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'Survey ID': [1,2,3],
                   'Q1_Topic A': [0,1,1], 
                   'Q1_Topic B': [1,0,1], 
                   'Q1_Topic C': [1,0,0],
                   'Q2_Topic A': [0,0,1], 
                   'Q2_Topic B': [0,1,0], 
                   'Q2_Topic C': [0,0,1],
                   'Gender': ['Male', 'Female', 'Male']
                  })

values = []

for ind, row in df1.iterrows():
    survey_ID = row['Survey ID']
    Gender = row['Gender']
    Q1 = row['Q1_Topic A'] * ['A'] + row['Q1_Topic B'] * ['B'] + row['Q1_Topic C'] * ['C']
    Q2 = row['Q2_Topic A'] * ['A'] + row['Q2_Topic B'] * ['B'] + row['Q2_Topic C'] * ['C']

    for i in range(max(len(Q1), len(Q2))):
        if i >= len(Q1):
            record = [survey_ID, np.nan, Q2[i], Gender]
        elif i >= len(Q2):
            record = [survey_ID, Q1[i], np.nan, Gender]
        else:
            record = [survey_ID, Q1[i], Q2[i], Gender]
        values.append(record)

df2 = pd.DataFrame(values, columns = ['Survey ID', 'Q1', 'Q2', 'Gender'])

这个代码怎么样?这不是花哨的代码,而是直观的

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'Survey ID': [1,2,3],
                   'Q1_Topic A': [0,1,1], 
                   'Q1_Topic B': [1,0,1], 
                   'Q1_Topic C': [1,0,0],
                   'Q2_Topic A': [0,0,1], 
                   'Q2_Topic B': [0,1,0], 
                   'Q2_Topic C': [0,0,1],
                   'Gender': ['Male', 'Female', 'Male']
                  })

values = []

for ind, row in df1.iterrows():
    survey_ID = row['Survey ID']
    Gender = row['Gender']
    Q1 = row['Q1_Topic A'] * ['A'] + row['Q1_Topic B'] * ['B'] + row['Q1_Topic C'] * ['C']
    Q2 = row['Q2_Topic A'] * ['A'] + row['Q2_Topic B'] * ['B'] + row['Q2_Topic C'] * ['C']

    for i in range(max(len(Q1), len(Q2))):
        if i >= len(Q1):
            record = [survey_ID, np.nan, Q2[i], Gender]
        elif i >= len(Q2):
            record = [survey_ID, Q1[i], np.nan, Gender]
        else:
            record = [survey_ID, Q1[i], Q2[i], Gender]
        values.append(record)

df2 = pd.DataFrame(values, columns = ['Survey ID', 'Q1', 'Q2', 'Gender'])
使用:

使用:


Q2_主题A来自哪里?逻辑是什么?对不起,是打字机。问题2现在有一个X、Y和Z类别。基本上每个问题都有独特的类别可供选择。如果他们选择了一个类别,那么它将是一个1如果不是,那么0第二季度主题a来自哪里?逻辑是什么?对不起,是打字机。问题2现在有一个X、Y和Z类别。基本上每个问题都有独特的类别可供选择。如果他们选择了一个类别,它将是一个1,如果不是,那么0这是可以的,但真正的东西有很多列。5个问题,每个问题都有许多主题,形成大约178个专栏。为它键入代码将是一场噩梦。这没关系,但真正的东西有很多列。5个问题,每个问题都有许多主题,形成大约178个专栏。输入密码会是一场噩梦。嗨@jezrael我没有在我的真实DF上得到正确的数字。我真正的DF在。我使用了相同的代码,只是在“u”处将拆分调整为拆分。我花了几个小时试图找出哪些数字加起来不正确。我们将一如既往地感谢您的帮助。@Mish-Super,数据已下载。您是否也可以获得预期的输出或测试数据的某种方式?换言之,我如何测试输出是否符合需要?好的,基本上这是为了可视化。Tableau不喜欢一堆0和1。每一列都是一个主题,它的组都附带了一个“u”@jezrael,就像我发布的示例一样,我需要将每个组作为一列输出,并且在每一列中都包含主题的值或空值。这有意义吗?例如。输出应该有一个名为“Stream 4 Topics”的列,因为它位于“\ux”之前。当我计算在我的原始DF中出现“可访问性”的次数时,我得到14,因为有14个1。然而,输出显示在列中出现了42次,这是不正确的。@Mish-是否可能从第一行获得预期的输出?Hi@jezrael我在实际DF上没有得到正确的数字。我真正的DF在。我使用了相同的代码,只是在“u”处将拆分调整为拆分。我花了几个小时试图找出哪些数字加起来不正确。我们将一如既往地感谢您的帮助。@Mish-Super,数据已下载。您是否也可以获得预期的输出或测试数据的某种方式?换言之,我如何测试输出是否符合需要?好的,基本上这是为了可视化。Tableau不喜欢一堆0和1。每一列都是一个主题,它的组都附带了一个“u”@jezrael,就像我发布的示例一样,我需要将每个组作为一列输出,并且在每一列中都包含主题的值或空值。这有意义吗?例如。输出应该有一个名为“Stream 4 Topics”的列,因为它位于“\ux”之前。当我计算在我的原始DF中出现“可访问性”的次数时,我得到14,因为有14个1。但是输出显示在列中出现了42次,这是不正确的。@Mish-是否可能从第一行获得预期的输出?