Pandas:保存为 csv 时的内存差异(Dataframe 与多索引系列)
Pandas: Memory difference when saving to csv (Dataframe vs multi-index Series)
Pandas to_csv
写入大小非常不同的文件,具体取决于它们是多索引系列还是简单的未堆叠数据帧(后者似乎小于一半大小)。
csv 格式背后可能有一些直觉,但我不太明白。
为什么 pandas 系列在 .csv 格式上比 Dataframes 大得多?
生成此示例的代码:
# imports
import pandas as pd
from numpy.random import random
from random import randint
# generate some data (1000 x 1000)
n_rows = 1000
n_cols = 1000
large = pd.DataFrame(np.random.random((n_rows, n_cols)))
# generate some indexes
large['index_1'] = [randint(0,100) for i in range(n_rows)]
large['index_2'] = [random() for i in range(n_rows)]
# make it a multi-index
large = large.set_index(['index_1', 'index_2']).sort_index()
# save as stacked and unstacked
large.to_csv('unstacked_example.csv')
large.stack().reset_index().to_csv('stacked_example.csv')
然后用ls -lh
得到尺寸:
unstacked_example.csv - 19M
stacked_example.csv - 50M
在 unstacked
示例中,您只打印了每个索引和每个列一次。在 stacked
示例中,您打印了每个索引 1000 次,每个列值打印了 1000 次。
未堆叠
large.size + large.index.size + large.columns.size
1002000
堆叠
slarge = large.stack()
slarge.size + slarge.index.size
2000000
这就是我们发明表格的原因...因为它通常更方便、更高效。
Pandas to_csv
写入大小非常不同的文件,具体取决于它们是多索引系列还是简单的未堆叠数据帧(后者似乎小于一半大小)。
csv 格式背后可能有一些直觉,但我不太明白。
为什么 pandas 系列在 .csv 格式上比 Dataframes 大得多?
生成此示例的代码:
# imports
import pandas as pd
from numpy.random import random
from random import randint
# generate some data (1000 x 1000)
n_rows = 1000
n_cols = 1000
large = pd.DataFrame(np.random.random((n_rows, n_cols)))
# generate some indexes
large['index_1'] = [randint(0,100) for i in range(n_rows)]
large['index_2'] = [random() for i in range(n_rows)]
# make it a multi-index
large = large.set_index(['index_1', 'index_2']).sort_index()
# save as stacked and unstacked
large.to_csv('unstacked_example.csv')
large.stack().reset_index().to_csv('stacked_example.csv')
然后用ls -lh
得到尺寸:
unstacked_example.csv - 19M
stacked_example.csv - 50M
在 unstacked
示例中,您只打印了每个索引和每个列一次。在 stacked
示例中,您打印了每个索引 1000 次,每个列值打印了 1000 次。
未堆叠
large.size + large.index.size + large.columns.size
1002000
堆叠
slarge = large.stack()
slarge.size + slarge.index.size
2000000
这就是我们发明表格的原因...因为它通常更方便、更高效。