将列附加到新数据框

Posted

技术标签:

【中文标题】将列附加到新数据框【英文标题】:Appending columns to a new dataframe 【发布时间】:2019-01-22 10:46:33 【问题描述】:

我有一个看起来像这样的数据框。

df =

    0   1   2   3   4
0   0.5 0.4 0.3 0.2 0.1
1   0.5 0.4 0.3 0.2 0.1
2   0.5 0.4 0.3 0.2 0.1
3   0.5 0.4 0.3 0.2 0.1

还有一个看起来像这样的列表。

dir = [[0,1,2],[3,4]] 

我想要做的是创建一个新的空数据框,并根据列表用附加的列填充它。为此,我需要遍历列表并附加相应的列。这是所需的输出:

    0    1
0   0.5  0.2
1   0.5  0.2
2   0.5  0.2
3   0.5  0.2
4   0.4  0.1
5   0.4  0.1
6   0.4  0.1
7   0.4  0.1
8   0.3
9   0.3
10  0.3
11  0.3

这是我的代码尝试:

new_df = pd.DataFrame()
for i in dir:
    for j in i:
        new_df.append([df[i]])

但是每次都会覆盖新的数据帧而不是追加,并且还会将数据追加为行而不是列。

编辑 以下解决方案适用于等长列表的列表:

L = [[0,1],[2,3]]

df = pd.DataFrame(np.hstack([df[x].values.T.ravel()[:, None] for x in L]))
print (df)

但是我需要一个可以处理不同长度列表的解决方案(即 list = [ [0,1,2], [3,4] ])

【问题讨论】:

【参考方案1】:

使用numpy.hstack 防止使用DataFrame 构造函数按列名对齐列:

L = [[0,1],[2,3]]

df = pd.DataFrame(np.hstack([df[x].values.T.ravel()[:, None] for x in L]))
print (df)

     0    1
0  0.5  0.3
1  0.5  0.3
2  0.5  0.3
3  0.5  0.3
4  0.4  0.2
5  0.4  0.2
6  0.4  0.2
7  0.4  0.2

编辑:对于一般解决方案,请创建 Series 并通过 concat 加入:

L = [[0,1,2],[3,4]] 

df = pd.concat([pd.Series(df[x].values.T.ravel()) for x in L], axis=1)
print (df)
      0    1
0   0.5  0.2
1   0.5  0.2
2   0.5  0.2
3   0.5  0.2
4   0.4  0.1
5   0.4  0.1
6   0.4  0.1
7   0.4  0.1
8   0.3  NaN
9   0.3  NaN
10  0.3  NaN
11  0.3  NaN

【讨论】:

也许,我认为,只是轻微的结构调整可以匹配 op 的预期输出。 pd.DataFrame(np.vstack([df[x].values.T.ravel() for x in l]).T) 感谢@jezrael,这些对示例非常有效。但这适用于包含以下内容的列表:list = [ [0,1,2], [3,4], [5], [6,7,8,9,10], [11,12 ] ] ? 您的解决方案@Wen 的同样问题 :) 它适用于具有不同形状的列表列表吗?【参考方案2】:

使用melt

l=[[0,1],[2,3]]
d=x : df[y].melt().value.tolist()  for x,y in enumerate(l)
pd.DataFrame(d)
Out[171]: 
     0    1
0  0.5  0.3
1  0.5  0.3
2  0.5  0.3
3  0.5  0.3
4  0.4  0.2
5  0.4  0.2
6  0.4  0.2
7  0.4  0.2

【讨论】:

感谢@Wen,这对于给出的示例很有效。这需要如何更改以接受具有不同长度的列表列表?例如列表 = [ [0,1,2], [3,4], [5], [6,7] ]

以上是关于将列附加到新数据框的主要内容,如果未能解决你的问题,请参考以下文章

将数据框中的值列表附加到新列[重复]

Python:将列附加到 PrettyTable 中的现有表

使用 Eigen 库将列附加到矩阵

如何将列附加到列表中的 data.frames,其中该列应包含计算读取的那些 data.frames 的结构信息?

SQL Server:将列转换为另一个并将其值附加到单独的列

Pandas - 将列值组合到新列中的列表中