Python 将几列合并为一列

Python 将几列合并为一列,python,pandas,merge,Python,Pandas,Merge,我有一个这样的数据框(我正在尝试调整它,因为它是西班牙语的,复制粘贴没有帮助) 所以,许多专栏实际上是对同一个问题的回答,只是不同的选择。我想做的是这样的合并: Question 1 Question 2 0 yes NaN 1 None Uber 2 NaN Didi 也就

我有一个这样的数据框(我正在尝试调整它,因为它是西班牙语的,复制粘贴没有帮助)

所以,许多专栏实际上是对同一个问题的回答,只是不同的选择。我想做的是这样的合并:

    Question 1    Question 2    
 0     yes            NaN                  
 1     None           Uber                  
 2     NaN            Didi                 
也就是说,以某种方式将每个问题的所有答案汇总到一列中(前提是所有答案都是互斥的)。给每一个都加上标签会更好。我相信for循环可以做到这一点,但我在实现它方面非常糟糕,强烈建议不要在python中使用循环。

您可以使用从列中提取问题部分,然后
groupby
沿着
轴=1
提取的系列上的数据帧,并使用
first
进行聚合:

g = df.columns.str.extract(r'(Question \d+)', expand=False)
out = df.groupby(g, axis=1).first()
结果:

  Question 1 Question 2
0        yes        NaN
1       None       Uber
2        NaN       Didi
试试这个:

(pd.wide_to_long(df.reset_index(), ['Question 1', 'Question 2'], 'index', 'Option', sep=' ', suffix='.*')\
  .dropna(how='all')
  .max(level=1)
  .reset_index())
输出:

   Option Question 1 Question 2
0  opt. C        yes        NaN
1  opt. A        NaN       Uber
2  opt. B       None        NaN
   Question 1 opt. A  Question 1 opt. B Question 1 opt. C Question 2 opt. A  Question 2 opt. B
0                NaN                NaN               yes               NaN                NaN
1                NaN                NaN               NaN              Uber                NaN
2                NaN                NaN               NaN              Didi                NaN
  Question 1 opt. A Question 1 opt. B Question 1 opt. C Question 2 opt. A Question 2 opt. B Question 1 Question 2
0                                                   yes                                            yes
1                                                                    Uber                                    Uber
2                                                                    Didi                                    Didi

使用fillna将None和NaN替换为emtpy字符串。然后 rest是简单的连接

代码:

输出:

   Option Question 1 Question 2
0  opt. C        yes        NaN
1  opt. A        NaN       Uber
2  opt. B       None        NaN
   Question 1 opt. A  Question 1 opt. B Question 1 opt. C Question 2 opt. A  Question 2 opt. B
0                NaN                NaN               yes               NaN                NaN
1                NaN                NaN               NaN              Uber                NaN
2                NaN                NaN               NaN              Didi                NaN
  Question 1 opt. A Question 1 opt. B Question 1 opt. C Question 2 opt. A Question 2 opt. B Question 1 Question 2
0                                                   yes                                            yes
1                                                                    Uber                                    Uber
2                                                                    Didi                                    Didi

当选项不是相互排斥时会发生什么?你用环做过什么?他们被劝阻了,但是没有什么比循环更能显示你的真正意图了。看看使用
pd.wide\u to\u long
。我真的很不擅长循环。所以我只想了一下。我没有得到任何有意义的回答。很好的回答+你好吗,我的朋友?保持安全和健康?谢谢。我很好。祝你圣诞快乐,新年快乐:)在这里使用
wide\u to\u long
真是个好主意。。