将列附加到新数据框
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 中的现有表
如何将列附加到列表中的 data.frames,其中该列应包含计算读取的那些 data.frames 的结构信息?