首页 > 解决方案 > 将行附加到具有不相等列的 Dataframe 的最有效方法

问题描述

我试图在每次迭代时将一行(df_row)附加到父数据帧(df_all)。父数据框具有所有可能的列值,并且每次迭代都会生成一行,其中包含一组唯一的列,这些列是所有可能列的子集。它看起来像这样:

df_all

最初有所有可能的列名:

Index A B C D E F G H

迭代 1:

df_row1:

Index A C D E F
  ID1 1 2 3 5 1 

df_all=df_all.append(df_row1)

现在df_all看起来如下:

df_all:

Index A  B  C  D  E  F  G  H 
  ID1 1  na 2  3  5  1 na na

迭代 2:

df_row2

Index A B D F G H
  ID2 0 8 3 5 1 4
df_all=df_all.append(df_row2)

现在df_all看起来如下:

df_all:

Index A  B  C  D  E  F  G  H 
  ID1 1  na 2  3  5  1 na na
  ID2 0  8  na 3  na 5  1  4

等等...

但是,我有 >20000 行要添加,并且添加每一行所花费的时间随着每次新迭代而增加。有没有办法在合理的时间内更有效地添加它?

标签: pythonpandasdataframe

解决方案


请注意,您可以从 Series 或 dicts 列表构建 DataFrame:

In [46]: pd.DataFrame([pd.Series({'A':1,'B':2}), pd.Series({'A':2,'C':3})])
Out[186]: 
     A    B    C
0  1.0  2.0  NaN
1  2.0  NaN  3.0

In [187]: pd.DataFrame([{'A':1,'B':2}, {'A':2,'C':3}])
Out[187]: 
   A    B    C
0  1  2.0  NaN
1  2  NaN  3.0

因此,您可以像这样构建 DataFrame:

data = []
for n in range(20000):
    df_row = pd.Series(...)
    data.append(df_row)

df = pd.DataFrame(data)

这比df.append在 for 循环中调用更有效,因为这会导致二次复制


推荐阅读