在熊猫中将多列合并为一列

Posted

技术标签:

【中文标题】在熊猫中将多列合并为一列【英文标题】:merging multiple columns into one columns in pandas 【发布时间】:2017-05-28 09:59:26 【问题描述】:

我有一个名为 ref(first dataframe) 的数据框,其中包含 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,合并列,但无法正常工作。

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

【问题讨论】:

为什么需要追加列?新列与维度不匹配 【参考方案1】:

您可以使用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 的另一种解决方案是通过valuesdf 转换为numpy array,然后通过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

【讨论】:

感谢您的时间、答案和帮助。我真的很感激。 如果我或其他答案有帮助,请不要忘记accept。谢谢。 我是 *** 的新手。我该如何接受你的回答?你的意思是点击箭头按钮? 您需要点击答案左上角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')

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

【讨论】:

感谢您的时间、答案和帮助。我真的很感激。【参考方案3】:

如下使用列表(zip()):

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

【讨论】:

您是否对其进行了测试并按预期工作?例如看 OP 图片 感谢您的时间、答案和帮助。我真的很感激。【参考方案4】:

试试这个,效果如你所愿 将 numpy 导入为 np 将熊猫导入为 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)

输出低于

【讨论】:

感谢您的时间、答案和帮助。我真的很感激。 我是 *** 的新手。我该如何接受你的回答?你的意思是点击箭头按钮?【参考方案5】:

这可能是一个快速的选择,也许您可​​以在循环中使用它。

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)

问候

【讨论】:

以上是关于在熊猫中将多列合并为一列的主要内容,如果未能解决你的问题,请参考以下文章

在 Postgres 中将多列合并为一列

在熊猫数据框中将多列拆分为行

熊猫在循环中将多列相乘

为一列熊猫数据框着色

将多列中的列表合并到熊猫中的单列

合并Dataframe(熊猫)中的所有列-python3 [重复]