在熊猫中将多列合并为一列
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】:您可以使用unstack
从DataFrame
创建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
的另一种解决方案是通过values
将df
转换为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)
问候
【讨论】:
以上是关于在熊猫中将多列合并为一列的主要内容,如果未能解决你的问题,请参考以下文章