我正在运行一个基本脚本,该脚本在嵌套字典中循环,从每条记录中获取数据,并将其追加到Pandas DataFrame中。
data = {"SomeCity": {"Date1": {record1, record2, record3, ...}, "Date2": {}, ...}, ...}
它总共有几百万条记录。脚本本身看起来像这样:
city = ["SomeCity"]
df = DataFrame({}, columns=['Date', 'HouseID', 'Price'])
for city in cities:
for dateRun in data[city]:
for record in data[city][dateRun]:
recSeries = Series([record['Timestamp'],
record['Id'],
record['Price']],
index = ['Date', 'HouseID', 'Price'])
FredDF = FredDF.append(recSeries, ignore_index=True)
然而,这运行得非常慢。在我寻找并行化它的方法之前,我只想确保我没有错过一些明显的东西,这些东西会使它运行得更快,因为我对Pandas还很陌生。
7条答案
按热度按时间wbgh16ku1#
我还在循环中使用了dataframe的append函数,我对它的运行速度感到困惑。
一个有用的例子,为那些谁是痛苦的,根据正确的答案在这一页。
Python版本:3
Pandas版:0.20.3
"from_dict"函数:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.from_dict.html
b5lpy0ml2#
向列表追加行比向
DataFrame
追加行要高效得多。1.将行追加到列表中。
1.然后将其转换为
DataFrame
和1.根据需要设置索引。
polhcujo3#
我认为最好的方法是,如果你知道你将要接收的数据,提前分配。
这是我认为最有意义的模式。如果 Dataframe 非常小,
append
会更快,但它不能伸缩。当我们使用100,000行 Dataframe 运行此操作时,我们看到了更加显著的结果。
因此,我们可以看到,追加比插入 Dataframe 慢17倍,比插入numpy数组慢35倍。
hiz5n14c4#
另一种方法是将其制成列表,然后使用
pd.concat
%timeit concat(df)
:20.2 ms ± 794 µs/循环(7次运行的平均值±标准差,每次100次循环)
%timeit append(df)
275 ms ± 2.54 ms/循环(7次运行的平均值±标准差,每次1个循环)
现在,建议使用以下方式连接pandom中的行:
迭代地将行追加到DataFrame比单个连接需要更大的计算量。更好的解决方案是将这些行追加到列表,然后一次性将该列表与原始DataFrame连接在一起。link
j1dl9f465#
我遇到了一个类似的问题,我不得不多次向DataFrame追加,但是在追加之前不知道值。()。我用它来累积所有的数据,然后在完成时将输出转换为Pandas DataFrame。下面是我的项目的链接,都是开源的,所以我希望它能帮助其他人:
https://pypi.python.org/pypi/raccoon
csbfibhn6#
在我的例子中,我从不同的文件中加载了大量具有相同列的 Dataframe ,并希望将它们追加到一个大型 Dataframe 中。
我的解决方案是首先将所有 Dataframe 加载到列表中,然后使用
col17t5w7#