python - 将行附加到具有不相等列的 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 行要添加,并且添加每一行所花费的时间随着每次新迭代而增加。有没有办法在合理的时间内更有效地添加它?
解决方案
请注意,您可以从 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 循环中调用更有效,因为这会导致二次复制。
推荐阅读
- sql - 如何在它们不靠近时合并多个选择语句?
- r - 高效绘制层次集群的一部分
- javascript - 如何合并两个 JSON,其中一个 JSON 将具有实际响应,另一个将提供配置
- java - 如何使用 aws java SDK 调用使用 Cognito 隐式授权授权的 api 端点
- python - 使用 Python 拉取 Mimecast 日志
- sql - 使用 SQL 是否可以在不考虑字符顺序的情况下通过字符串进行搜索?
- r - 将时间转换为十进制小时或十进制分钟
- c# - 来自 SQL Server Windows 身份验证登录的 ASP.NET 异常错误
- javascript - 固定内容的位置,直到父 div 结束
- google-bigquery - Google BigQuery:将查询结果保存到表时找不到数据集