将多个列合并到pandas中的一列中

时间:2017-01-13 05:01:20

标签: python-3.x pandas stack concat

我有一个名为ref(第一个数据帧)的数据框,其中包含列c1,c2,c3和c4。

ref= pd.DataFrame([[1,3,.3,7],[0,4,.5,4.5],[2,5,.6,3]], columns=['c1','c2','c3','c4'])
print(ref)
   c1  c2   c3   c4
0   1   3  0.3  7.0
1   0   4  0.5  4.5
2   2   5  0.6  3.0

我想创建一个新列,即c5(第二个数据帧),其中包含c1,c2,c3和c4列的所有值。

我尝试了concat,合并列,但我无法让它工作。

如果您有解决方案,请告诉我?

pic

5 个答案:

答案 0 :(得分:3)

您可以使用unstackSeries创建DataFrame,然后concat创建原始版本:

print (pd.concat([ref, ref.unstack().reset_index(drop=True).rename('c5')], axis=1))
     c1   c2   c3   c4   c5
0   1.0  3.0  0.3  7.0  1.0
1   0.0  4.0  0.5  4.5  0.0
2   2.0  5.0  0.6  3.0  2.0
3   NaN  NaN  NaN  NaN  3.0
4   NaN  NaN  NaN  NaN  4.0
5   NaN  NaN  NaN  NaN  5.0
6   NaN  NaN  NaN  NaN  0.3
7   NaN  NaN  NaN  NaN  0.5
8   NaN  NaN  NaN  NaN  0.6
9   NaN  NaN  NaN  NaN  7.0
10  NaN  NaN  NaN  NaN  4.5
11  NaN  NaN  NaN  NaN  3.0

创建Series的替代解决方案是将df转换为numpy arrayvalues,然后再转发ravel

    print (pd.concat([ref, pd.Series(ref.values.ravel('F'), name='c5')], axis=1))
         c1   c2   c3   c4   c5
    0   1.0  3.0  0.3  7.0  1.0
    1   0.0  4.0  0.5  4.5  0.0
    2   2.0  5.0  0.6  3.0  2.0
    3   NaN  NaN  NaN  NaN  3.0
    4   NaN  NaN  NaN  NaN  4.0
    5   NaN  NaN  NaN  NaN  5.0
    6   NaN  NaN  NaN  NaN  0.3
    7   NaN  NaN  NaN  NaN  0.5
    8   NaN  NaN  NaN  NaN  0.6
    9   NaN  NaN  NaN  NaN  7.0
    10  NaN  NaN  NaN  NaN  4.5
    11  NaN  NaN  NaN  NaN  3.0

答案 1 :(得分:2)

使用join + ravel('F')

ref.join(pd.Series(ref.values.ravel('F')).to_frame('c5'), how='right')

使用join + T.ravel()

ref.join(pd.Series(ref.values.T.ravel()).to_frame('c5'), how='right')

pd.concat + T.stack() + rename

pd.concat([ref, ref.T.stack().reset_index(drop=True).rename('c5')], axis=1)

太多转置+ append

ref.T.append(ref.T.stack().reset_index(drop=True).rename('c5')).T

combine_first + ravel('F') &lt; ---我最喜欢的 < / p>

ref.combine_first(pd.Series(ref.values.ravel('F')).to_frame('c5'))

所有收益

     c1   c2   c3   c4   c5
0   1.0  3.0  0.3  7.0  1.0
1   0.0  4.0  0.5  4.5  0.0
2   2.0  5.0  0.6  3.0  2.0
3   NaN  NaN  NaN  NaN  3.0
4   NaN  NaN  NaN  NaN  4.0
5   NaN  NaN  NaN  NaN  5.0
6   NaN  NaN  NaN  NaN  0.3
7   NaN  NaN  NaN  NaN  0.5
8   NaN  NaN  NaN  NaN  0.6
9   NaN  NaN  NaN  NaN  7.0
10  NaN  NaN  NaN  NaN  4.5
11  NaN  NaN  NaN  NaN  3.0

答案 2 :(得分:0)

使用列表(zip()),如下所示:

d=list(zip(df1.c1,df1.c2,df1.c3,df1.c4))
df2['c5']=pd.Series(d)

答案 3 :(得分:0)

尝试这个,按预期工作     导入numpy为np     将pandas导入为pd

df = pd.DataFrame([[1,2,3,4],[2,3,4,5],[3,4,5,6]], columns=['c1','c2','c3','c4'])
print(df)
r = len(df['c1'])
c = len(list(df))

ndata = list(df.c1) + list(df.c2) + list(df.c3) + list(df.c4)
r = len(ndata) - r
t = r*c
dfnan = pd.DataFrame(np.reshape([np.nan]*t, (r,c)), columns=list(df))
df = df.append(dfnan)
df['c5'] = ndata
print(df)

输出低于

enter image description here

答案 4 :(得分:0)

这可能是一个快速选项,也许你可以在循环中使用它。

import numpy as np

import pandas as pd

df = pd.DataFrame([[1,2,3,4],[2,3,4,5],[3,4,5,6]], columns=['c1','c2','c3','c4'])

df['c5'] = df.iloc[:,0].astype(str) + df.iloc[:,1].astype(str) + df.iloc[:,2].astype(str) + df.iloc[:,3].astype(str)

问候