pandas 如何将多个不同长度的列添加到DataFrame

41ik7eoe  于 2023-04-10  发布在  其他
关注(0)|答案(4)|浏览(292)

我必须在循环中逐列地构建DataFrame,每列都有不同的长度。
我从一个空的DataFrame开始,但我已经知道了列名:

import pandas as pd
df = pd.DataFrame(columns=['g1','g2'])

我的列数据是从另一个DataFrame中提取的Series。让我们在这里创建一些虚构的数据:

s1 = pd.Series(index=[1,2],data=[10,11],name='g1')
s2 = pd.Series(index=[3,4,5],data=[12,13,14],name='g2')
# etc.

请注意,这两个序列具有不同的索引值和不同的长度(并非所有索引值都不同,有些可能重叠)。现在我想进入循环,并在每次迭代时向DataFrame添加一个新列。在循环的and处,我的DataFrame应该如下所示:

Index      g1      g2
0          10      12
1          11      13
2          NaN     14

换句话说:
1.索引被扩展以覆盖最大的列,并重置为0..n-1,其中n是所有列的最大尺子
1.每个系列都追加为一个新列,其名称与原始已知列名相同
1.缺失元素为NaN

qaxu7uf2

qaxu7uf21#

使用nameDataFrame

df = pd.DataFrame({s.name: s.reset_index(drop=True) for s in [s1, s2]})

输出:

print(df)

     g1  g2
0  10.0  12
1  11.0  13
2   NaN  14
dgenwo3n

dgenwo3n2#

使用concatSeries.reset_index以及参数drop=True作为默认索引:

L = [s1, s2]

df = pd.concat([s.reset_index(drop=True) for s in L], axis=1)
print (df)
     g1  g2
0  10.0  12
1  11.0  13
2   NaN  14

定量环溶液:

L = [s1, s2]

for s in L:
    s1 = s.reset_index(drop=True)
    df = df.reindex(s1.index)
    df[s1.name] = s1
print (df)
     g1  g2
0  10.0  12
1  11.0  13
2   NaN  14
rqcrx0a6

rqcrx0a63#

基于@Timeless的答案,如果你想更新原始的DataFrame,你可以用途:

l = [s1, s2]

tmp = pd.DataFrame({s.name: s.reset_index(drop=True) for s in l})

df[list(tmp)] = tmp

print(df)

或者,作为一行程序:

df[list(tmp)] = (tmp:=pd.DataFrame({s.name: s.reset_index(drop=True) for s in [s1, s2]}))

print(df)

输出:

g1  g2
0  10.0  12
1  11.0  13
2   NaN  14
wfveoks0

wfveoks04#

以下是我找到的两个解决方案:
1.感谢@Timeless。第一个解决方案在循环中构建一个系列列表,然后在最后使用dict构建DataFrame。

series_list = []
    for i in col_names:
        series_list.append(series)
    df = pd.DataFrame({s.name: s.reset_index(drop=True) for s in series_list})

1.感谢jezrael,他使用了concat而不是merge,这是我最初尝试使用的。在这种情况下,我们从一个空的DataFrame开始,然后在每次迭代时添加一个新列。在添加之前,我们重置了系列的索引。使用concat而不是仅仅将系列分配给列的好处是:concat会根据需要自动放大DataFrame

df = pd.DataFrame()
    s = # get new column at each iteration
    for i in col_names:
        df = pd.concat([df,s.reset_index(drop=True).rename(i)],axis=1)

相关问题