【问题标题】: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,合并列,但无法正常工作。

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

【问题讨论】:

  • 为什么需要追加列?新列与维度不匹配

标签: python-3.x pandas stack 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。谢谢。
  • 我是 stackoverflow 的新手。我该如何接受你的回答?你的意思是点击箭头按钮?
  • 您需要点击答案左上角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)

输出低于

【讨论】:

  • 感谢您的时间、答案和帮助。我真的很感激。
  • 我是 stackoverflow 的新手。我该如何接受你的回答?你的意思是点击箭头按钮?
【解决方案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)

问候

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2015-09-03
    • 2018-09-29
    • 2019-08-01
    • 2021-12-02
    • 2022-12-06
    相关资源
    最近更新 更多