Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在python中合并多个大型数据帧的最佳方法是什么?_Python_Pandas_Dataframe_Merge - Fatal编程技术网

什么';在python中合并多个大型数据帧的最佳方法是什么?

什么';在python中合并多个大型数据帧的最佳方法是什么?,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我正在开发一个Google Analytics API,它可以提取我需要的所有维度和指标,并将它们排序到数据框架中。我的代码总共有九个数据帧 当我尝试合并数据帧时,我不断收到一条“Killed:9”错误消息。我知道我的代码效率很低,在一个接一个的合并过程中可能会占用大量内存,但我不知道如何修复它 以下是合并的示例 MergeThree = pd.merge(MergeTwo, dfFour, how = 'outer', on = ['A', 'B', 'C', 'D']).fillna(0)

我正在开发一个Google Analytics API,它可以提取我需要的所有维度和指标,并将它们排序到数据框架中。我的代码总共有九个数据帧

当我尝试合并数据帧时,我不断收到一条“Killed:9”错误消息。我知道我的代码效率很低,在一个接一个的合并过程中可能会占用大量内存,但我不知道如何修复它

以下是合并的示例

MergeThree = pd.merge(MergeTwo, dfFour, how = 'outer', on = ['A', 'B', 'C', 'D']).fillna(0)
MergeThree = MergeThree[[
#dimensions
'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P',
#metrics
'Q', 'R', 'S', "T", 'U',
'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', "AC"
]]

MergeFour = pd.merge(MergeThree, dfFive, how = 'outer', on = ['A', 'B', 'C', 'D']).fillna(0)
MergeFour = MergeFour[[
#dimensions
'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'AD',
#metrics
'Q', 'R', 'S', "T", 'U',
'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', "AC"
]]

MergeFive = pd.merge(MergeFour, dfSix, how = 'outer', on = ['A', 'B', 'C', 'D']).fillna(0)
MergeFive = MergeFive[[
#dimensions
'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
'P', 'AD', 'AE',
#metrics
'Q', 'R', 'S', "T", 'U',
'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', "AC"
]]

ect. 
我已经尝试过许多不同版本的合并,我唯一可以开始工作的版本是这样的

def MergeProcessThree(x):
    MergeThree = pd.merge(x, dfFourX, how = 'outer', on = ['A', 'B', 'C', 'D']).fillna(0)
    MergeThree = MergeThree[[
    #dimensions
    'A', 'B', 'C', 'D', 'E', 'F',
    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
    'P',
    #metrics
    'Q', 'R', 'S', "T", 'U',
    'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', "AC"'
    ]]
    MergeThree.to_csv('MergeThree.csv.gz', mode='a', index=False, compression='gzip')

MergeTwoX = pd.read_csv('MergeTwo.csv.gz', chunksize=100, compression='gzip')

for i in MergeTwoX:
    MergeProcessThree(i)

print('Merge Three Complete')

def MergeProcessFour(x):
    MergeFour = pd.merge(x, dfFiveX, how = 'outer', on = [''A', 'B', 'C', 'D']).fillna(0)
    MergeFour = MergeFour[[
    #dimensions
    'A', 'B', 'C', 'D', 'E', 'F',
    'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
    'P', 'AD',
    #metrics
    'Q', 'R', 'S', "T", 'U',
    'V', 'W', 'X', 'Y', 'Z', 'AA', 'AB', "AC"
    ]]
    MergeFour.to_csv('MergeFour.csv.gz', mode='a', index=False, compression='gzip')

MergeThreeX = pd.read_csv('MergeThree.csv.gz', chunksize=100, compression='gzip')

for i in MergeThreeX:
    MergeProcessFour(i)

print('Merge Four Complete')

etc.
但数据看起来并不正确。看起来它基本上是翻倍的,但是缺少了正常合并中的东西,而不是由块分解的合并中的东西

我知道必须有更好的方法来实现这一点,并得到我所期待的结果


在此方面的任何帮助都将不胜感激

正如Chaos所提到的,压缩没有固定的方法,有时你可以从中获得很多,而其他时候可能没有多大帮助

一般的想法是,如果不改变原始值或在允许的阈值范围内,则可以使用较少的精度来表示数字。例如,如果一个列确实只有二进制值{0,1},那么您可以使用np.int8而不是普通的np.int32或64,如果您的应用程序可以接受这种截断,您可以通过简单的
df[binary\u column\u name]=df[binary\u column\u name].astype(int)
来实现

您可以编写一个函数,自动完成此操作

  • 首先检查列是否为整数
    • 然后检查它是否包含负值
      • 正:检查它所处的值范围,例如,如果最大值小于2^8=256,则您知道可以使用np.int8表示它,如果小于2^16,则可以使用np.int16表示它
      • 负数:与正数类似,但现在检查您的值是否落在例如
        np.iinfo(np.int8)->min=-128,max=127中
  • 浮动:与上面类似,检查您想要的值范围和精度
您可以查看系统信息或
pandas.DataFrame.memory\u usage
来比较执行上述步骤后减少的内存量


另外请注意,某些系统不支持某些数据类型,因此合并后可能需要将其转换为可接受的数据类型。(例如,如果要将df保存到feather,它不接受float16 afik)

问题似乎不是因为合并本身,而是因为数据大小和硬件内存。在不使用分布式环境的情况下,我能想到的一个建议是,您能压缩数据帧的值吗?e、 g.str->int,int32->int16,float64->float32各种DFs是如何构建的?是否可以在程序的早期将它们结合起来,或者以其他方式改进代码?另一方面,变量和函数名通常应遵循带有下划线的
小写形式。@Sam-感谢您的回复!您是否有您想参考的文档,详细说明如何进行您提到的数据帧压缩?我不太熟悉这样做,除非我只是单独更改所有列数据帧类型。@AHerdofSeaCows没有一种方法可以自动进行压缩。您需要对每一列进行判断(因为您知道它们的值以及可以使用的最小数据类型),并更改它们的数据类型。文档。可能考虑将这些数据放入临时表中,并在DB中执行这些操作。