将多列合并为一列在pandas中

6

我有一个名为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和merge列,但无法使其工作。
请告诉我是否有解决方案?

pic


为什么需要添加列?新列的维度不匹配。 - Po Stevanus Andrianta
5个回答

8
您可以使用 unstackDataFrame 创建 Series,然后再使用 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 array,然后使用 values 进行重塑,再使用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

感谢您的时间、回答和帮助。我非常感激。 - Sasihci
我是Stack Overflow的新手。我应该如何接受你的答案?你是指点击箭头按钮吗? - Sasihci
您需要点击答案左上角的1下方的空白处,然后勾选框会变成绿色。 - jezrael

3
使用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)

太多的转置加上“追加”操作
ref.T.append(ref.T.stack().reset_index(drop=True).rename('c5')).T

combine_first + ravel('F')是我最喜欢的组合。
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

感谢您的时间、回答和帮助。我非常感激。 - Sasihci

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)

问候


0

使用list(zip())如下:

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

你测试过它并且符合预期吗?请参考原帖中的图片示例。 - Po Stevanus Andrianta
感谢您的时间、回答和帮助。我非常感激。 - Sasihci

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'])
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


谢谢您抽出时间回答我的问题并提供帮助,我非常感激。 - Sasihci
我是Stack Overflow的新手。我应该如何接受你的答案?你是指点击箭头按钮吗? - Sasihci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接