Python 使用pandas将多个列缩减为一个列

Python 使用pandas将多个列缩减为一个列,python,python-3.x,pandas,Python,Python 3.x,Pandas,我想将数据框中的几列合并为一列: from functools import reduce # python 3.x na=pd.np.nan df1=pd.DataFrame({'a':[na,'B',na],'b':['A',na,na],'c':[na,na,'C']}) print(df1) a b c 0 NaN A NaN 1 B NaN NaN 2 NaN NaN C 我试图获得的输出应该是这样的(列名无关紧要): 我获取Val

我想将数据框中的几列合并为一列:

from functools import reduce # python 3.x
na=pd.np.nan
df1=pd.DataFrame({'a':[na,'B',na],'b':['A',na,na],'c':[na,na,'C']})
print(df1)
     a    b    c
0  NaN    A  NaN
1    B  NaN  NaN
2  NaN  NaN    C
我试图获得的输出应该是这样的(列名无关紧要):

我获取
ValueError:运行此行代码时,无法使用包含NA/NaN值的向量进行索引:

reduce(lambda c1,c2: df1[c1].fillna(df1[c2]),df1.loc[:,'a':'c'])
但是,当我将
reduce
sequence
参数更改为只有两列
df1.loc[:,'a':'b']
时,它似乎起作用了:

reduce(lambda c1,c2: df1[c1].fillna(df1[c2]),df1.loc[:,'a':'b'])
0      A
1      B
2    NaN
Name: a, dtype: object
我也尝试过使用DataFrame/Series
.combine
方法,但这会产生相同的错误如果我想填充非nan值,我想尝试使其正常工作

reduce(lambda c1,c2: df1[c1].combine(df1[c2],(lambda x,y: y if x==pd.np.nan else x)),df1.loc[:,'a':'c'])
但我认为这并不像我希望的那样有效,因为当我再次限制为只有两列时,我得到了以下输出:

reduce(lambda c1,c2: df1[c1].combine(df1[c2],(lambda x,y: y if x==pd.np.nan else x)),df1.loc[:,'a':'b'])
0    NaN
1      B
2    NaN
dtype: object

一种方法是使用轴1上的和

df1.fillna('').sum(1)

0    A
1    B
2    C
选项2:使用b填充并拾取第一列

df1.bfill(axis = 1).iloc[:, 0]
这也适用于:

pd.DataFrame(data=df.stack().values, index=df.index, columns=['a'])
结果:

    a
0   A
1   B
2   C
    a
0   A
1   B
2   C