我正在尝试将每次迭代的行(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,并且每次添加新行都会增加添加行的时间。有没有办法在合理的时间内更有效地添加它?
答案 0 :(得分:3)
请注意,您可以从Series或dict列表中构建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)
这比在for循环中调用df.append
效率更高,因为这会导致quadratic copying。
答案 1 :(得分:0)
我相信您正在寻找merge函数!
以df_all.merge(df_row, how='outer')
的身份试用,应该可以完成工作。