Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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
Pandas 熊猫重命名会增大HDF文件大小_Pandas_Hdf5_Pytables - Fatal编程技术网

Pandas 熊猫重命名会增大HDF文件大小

Pandas 熊猫重命名会增大HDF文件大小,pandas,hdf5,pytables,Pandas,Hdf5,Pytables,对于df.rename()方法和一般的重命名,我有一个相当复杂的问题。无论我如何尝试重命名现有数据帧中的列,结果HDF输出的大小都是原来的两倍。与大多数仅数字帧不同,我的帧包含许多被视为对象的unicode列 我尝试过以下几种情况,但所有这些似乎都会显著增加使用df.to_HDF(“some_file.h5”,“table”)生成的结果HDF文件 假设我有一个名为rename_dict的重命名字典,它看起来像: rename_dict = {'old_column': 'new_column'}

对于df.rename()方法和一般的重命名,我有一个相当复杂的问题。无论我如何尝试重命名现有数据帧中的列,结果HDF输出的大小都是原来的两倍。与大多数仅数字帧不同,我的帧包含许多被视为对象的unicode列

我尝试过以下几种情况,但所有这些似乎都会显著增加使用df.to_HDF(“some_file.h5”,“table”)生成的结果HDF文件

假设我有一个名为rename_dict的重命名字典,它看起来像:

rename_dict = {'old_column': 'new_column'}
案例A(使用就地):

案例B(不在现场使用):

案例C(手动重新映射并删除):

我觉得我一定是对这种重命名操作是如何发生的,从而在HDF文件中创建额外数据缺少了一些重要的理解

我不确定这是否与此问题有关,但我确实收到了有关未映射到c类型的对象的性能警告。虽然这很糟糕,但在不应用任何重命名操作的情况下,文件大小是“正确的”,因此我认为这是根本原因

任何见解(或解决方案)都将被感激地接受。

有关C,请参阅

简而言之,出于性能原因,删除实际上并不删除数据。重命名只是一个删除,后跟一个追加。您可以简单地
ptrepack
文件以回收空间(或创建新空间)。HDF5不是常规数据库。它适用于某些类型的操作,即追加和查询

您应该尝试使用
格式来消除这些警告。一般来说,您可能正在尝试存储非本地类型,这些类型会被腌制,请参阅


A和B是内存操作,与HDF5文件无关。

同意A和B都在内存中。我正在将一个文件(.csv)读入内存,执行重命名,然后将其保存到HDF5。一旦我将重命名方法应用于帧,它将使输出大小加倍。如果省略重命名方法,则文件大小为一半。由于所有操作都是在内存中执行的,对HDF的写入只发生在最后,我似乎无法理解为什么重命名方法似乎会导致帧大小加倍,从而创建一个大小加倍的HDF文件。您是从一个空文件开始的吗?(例如,
mode='w'
),每次?,按定义追加表格。因此,如果您运行两次脚本,它将附加两次。您应该更新您的案例以反映正在发生的事情。你在做什么;df.to_hdf()并获取具有
x
字节的文件。与
df=pd.read_csv()相比df=df.rename(列=rename_dict);df.to_hdf()`并获取一个具有
2x
字节的文件?将第二个字节写入与第一个字节不同的文件,以确保它没有追加。ptrepack post hdf Write就是其中的诀窍。我仍然不确定为什么内存中的pandas操作会在HDF中显示出来,无论我是直接使用pd.to_HDF还是直接使用HDFStore,但这现在解决了我的问题。非常感谢。。。
df.rename(columns=rename_dict, inplace=True)
df_renamed = df.rename(columns=rename_dict)
df['new_name'] = df['old_name]
del df['old_name']