gpt4 book ai didi

python - 按行组合 Pandas 数据帧的有效方法

转载 作者:太空狗 更新时间:2023-10-30 00:48:37 24 4
gpt4 key购买 nike

我有 14 个数据框,每个数据框有 14 列和超过 250,000 行。数据框具有相同的列标题,我想按行合并数据框。我试图将数据帧连接到一个“不断增长的”DataFrame,这需要几个小时。

基本上,我做了 13 次以下的事情:

DF = pd.DataFrame()
for i in range(13):
DF = pd.concat([DF, subDF])

stackoverflow 答案 here建议将所有子数据帧附加到列表,然后连接子数据帧列表。

这听起来像是在做这样的事情:

DF = pd.DataFrame()
lst = [subDF, subDF, subDF....subDF] #up to 13 times
for subDF in lst:
DF = pd.concat([DF, subDF])

它们不是一回事吗?也许我误解了建议的工作流程。这是我测试的内容。

import numpy
import pandas as pd
import timeit

def test1():
"make all subDF and then concatenate them"
numpy.random.seed(1)
subDF = pd.DataFrame(numpy.random.rand(1))
lst = [subDF, subDF, subDF]
DF = pd.DataFrame()
for subDF in lst:
DF = pd.concat([DF, subDF], axis=0,ignore_index=True)

def test2():
"add each subDF to the collecitng DF as you're making the subDF"
numpy.random.seed(1)
DF = pd.DataFrame()
for i in range(3):
subDF = pd.DataFrame(numpy.random.rand(1))
DF = pd.concat([DF, subDF], axis=0,ignore_index=True)

print('test1() takes {0} sec'.format(timeit.timeit(test1, number=1000)))
print('test2() takes {0} sec'.format(timeit.timeit(test2, number=1000)))

>> Output

test1() takes 12.732409087137057 sec
test2() takes 15.097430311612698 sec

如果您就按行连接多个大型 数据帧的有效方法提出建议,我将不胜感激。谢谢!

最佳答案

创建包含所有数据框的列表:

dfs = []
for i in range(13):
df = ... # However it is that you create your dataframes
dfs.append(df)

然后一口气将它们连接起来:

merged = pd.concat(dfs) # add ignore_index=True if appropriate

这比您的代码快很多,因为它恰好创建了 14 个数据帧(您的原始 13 加上 merged),而您的代码创建了其中的 26 个(您的原始 13 加上 13 中间合并)。

编辑:

这是您的测试代码的变体。

import numpy
import pandas as pd
import timeit

def test_gen_time():
"""Create three large dataframes, but don't concatenate them"""
for i in range(3):
df = pd.DataFrame(numpy.random.rand(10**6))

def test_sequential_concat():
"""Create three large dataframes, concatenate them one by one"""
DF = pd.DataFrame()
for i in range(3):
df = pd.DataFrame(numpy.random.rand(10**6))
DF = pd.concat([DF, df], ignore_index=True)

def test_batch_concat():
"""Create three large dataframes, concatenate them at the end"""
dfs = []
for i in range(3):
df = pd.DataFrame(numpy.random.rand(10**6))
dfs.append(df)
DF = pd.concat(dfs, ignore_index=True)

print('test_gen_time() takes {0} sec'
.format(timeit.timeit(test_gen_time, number=200)))
print('test_sequential_concat() takes {0} sec'
.format(timeit.timeit(test_sequential_concat, number=200)))
print('test_batch_concat() takes {0} sec'
.format(timeit.timeit(test_batch_concat, number=200)))

输出:

test_gen_time() takes 10.095820872998956 sec
test_sequential_concat() takes 17.144756617000894 sec
test_batch_concat() takes 12.99131180600125 sec

最大的份额对应于生成数据帧。批量连接大约需要 2.9 秒;顺序连接需要超过 7 秒。

关于python - 按行组合 Pandas 数据帧的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38246166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com