python - 在 python 中合并多个大型数据框的最佳方法是什么?
问题描述
我正在开发一个 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}s,那么您可以只使用 np.int8 而不是常见的 np.int32 或 64,您可以通过简单的方式来做到这一点df[binary_column_name] = df[binary_column_name].astype(int)
,另一个示例,np.float16(1.23456789)=1.234
如果这种截断是可以接受的到您的应用程序。
您可以编写一个自动执行此操作的函数,
- 首先检查列是否为整数
- 然后检查它是否包含负值
- 正:检查它所属的值范围,例如,如果最大值小于 2^8=256,那么你知道你可以用 np.int8 来表示它,如果小于 2^16,那么你可以用 np.int16 来表示它
- 负数:类似于正数,但现在检查您的值是否落在例如
np.iinfo(np.int8) -> min=-128, max=127
- 然后检查它是否包含负值
- Float:和上面类似,检查取值范围和你想要的精度
您可以查看系统信息,也pandas.DataFrame.memory_usage
可以比较执行上述步骤后减少了多少内存。
另请注意,某些系统不支持某些 dtype,因此您可能需要在合并后将其转换为接受的 dtype。(例如,如果您想将 df 保存为羽毛,它不接受 float16 afik)
推荐阅读
- c# - Helixtoolkit UWP TransformManipulator3D
- python-3.x - 将 requests.models.Response 转换为 flask.wrappers.Response 1:1
- c# - 使用多个集线器实例的 ASP.NET Core SignalR
- python - 使用 Googletrans 库自动翻译列
- javascript - 如何结合 jQuery SlimScroll 和 sortableUI?
- google-sheets - 在 Google Sheet 中查询条件中的数组
- amazon-web-services - 在没有凭据的情况下使用 aws-sdk
- android - 设备振动不断重复
- c++ - glm函数的问题
- flutter - PageView内的圆角图像保持比例Flutter