Pandas HDF限制CSV文件的行数
Pandas HDF limiting number of rows of CSV file
我有一个 3GB 的 CSV 文件。我正在尝试使用 Pandas 将其保存为 HDF 格式,以便我可以更快地加载它。
import pandas as pd
import traceback
df_all = pd.read_csv('file_csv.csv', iterator=True, chunksize=20000)
for _i, df in enumerate(df_all):
try:
print ('Saving %d chunk...' % _i, end='')
df.to_hdf('file_csv.hdf',
'file_csv',
format='table',
data_columns=True)
print ('Done!')
except:
traceback.print_exc()
print (df)
print (df.info())
del df_all
原始的CSV文件大约有300万行,这段代码的输出反映了这一点。最后一行输出是:Saving 167 chunk...Done!
这意味着:167*20000 = 3.340.000 行
我的问题是:
df_hdf = pd.read_hdf('file_csv.hdf')
df_hdf.count()
=> 4613 行
并且:
item_info = pd.read_hdf('ItemInfo_train.hdf', where="item=1")
Returns 没什么,即使我确定 "item" 列在原始文件中有一个条目等于 1。
有什么问题吗?
使用 append=True
告诉 to_hdf
将新块附加到同一个文件。
df.to_hdf('file_csv.hdf', ..., append=True)
否则,每次调用都会覆盖之前的内容,只有最后一个块保存在file_csv.hdf
。
import os
import numpy as np
import pandas as pd
np.random.seed(2016)
df = pd.DataFrame(np.random.randint(10, size=(100, 2)), columns=list('AB'))
df.to_csv('file_csv.csv')
if os.path.exists('file_csv.hdf'): os.unlink('file_csv.hdf')
for i, df in enumerate(pd.read_csv('file_csv.csv', chunksize=50)):
print('Saving {} chunk...'.format(i), end='')
df.to_hdf('file_csv.hdf',
'file_csv',
format='table',
data_columns=True,
append=True)
print('Done!')
print(df.loc[df['A']==1])
print('-'*80)
df_hdf = pd.read_hdf('file_csv.hdf', where="A=1")
print(df_hdf)
打印
Unnamed: 0 A B
22 22 1 7
30 30 1 7
41 41 1 9
44 44 1 0
19 69 1 3
29 79 1 1
31 81 1 5
34 84 1 6
使用 append=True
告诉 to_hdf
将新块附加到同一个文件。否则,只有最后一个块保存在 file_csv.hdf
:
import os
import numpy as np
import pandas as pd
np.random.seed(2016)
df = pd.DataFrame(np.random.randint(10, size=(100, 2)), columns=list('AB'))
df.to_csv('file_csv.csv')
if os.path.exists('file_csv.hdf'): os.unlink('file_csv.hdf')
for i, df in enumerate(pd.read_csv('file_csv.csv', chunksize=50)):
print('Saving {} chunk...'.format(i), end='')
df.to_hdf('file_csv.hdf',
'file_csv',
format='table',
data_columns=True,
append=True)
print('Done!')
print(df.loc[df['A']==1])
print('-'*80)
df_hdf = pd.read_hdf('file_csv.hdf', where="A=1")
print(df_hdf)
打印
Unnamed: 0 A B
22 22 1 7
30 30 1 7
41 41 1 9
44 44 1 0
19 69 1 3
29 79 1 1
31 81 1 5
34 84 1 6
我有一个 3GB 的 CSV 文件。我正在尝试使用 Pandas 将其保存为 HDF 格式,以便我可以更快地加载它。
import pandas as pd
import traceback
df_all = pd.read_csv('file_csv.csv', iterator=True, chunksize=20000)
for _i, df in enumerate(df_all):
try:
print ('Saving %d chunk...' % _i, end='')
df.to_hdf('file_csv.hdf',
'file_csv',
format='table',
data_columns=True)
print ('Done!')
except:
traceback.print_exc()
print (df)
print (df.info())
del df_all
原始的CSV文件大约有300万行,这段代码的输出反映了这一点。最后一行输出是:Saving 167 chunk...Done! 这意味着:167*20000 = 3.340.000 行
我的问题是:
df_hdf = pd.read_hdf('file_csv.hdf')
df_hdf.count()
=> 4613 行
并且:
item_info = pd.read_hdf('ItemInfo_train.hdf', where="item=1")
Returns 没什么,即使我确定 "item" 列在原始文件中有一个条目等于 1。
有什么问题吗?
使用 append=True
告诉 to_hdf
将新块附加到同一个文件。
df.to_hdf('file_csv.hdf', ..., append=True)
否则,每次调用都会覆盖之前的内容,只有最后一个块保存在file_csv.hdf
。
import os
import numpy as np
import pandas as pd
np.random.seed(2016)
df = pd.DataFrame(np.random.randint(10, size=(100, 2)), columns=list('AB'))
df.to_csv('file_csv.csv')
if os.path.exists('file_csv.hdf'): os.unlink('file_csv.hdf')
for i, df in enumerate(pd.read_csv('file_csv.csv', chunksize=50)):
print('Saving {} chunk...'.format(i), end='')
df.to_hdf('file_csv.hdf',
'file_csv',
format='table',
data_columns=True,
append=True)
print('Done!')
print(df.loc[df['A']==1])
print('-'*80)
df_hdf = pd.read_hdf('file_csv.hdf', where="A=1")
print(df_hdf)
打印
Unnamed: 0 A B
22 22 1 7
30 30 1 7
41 41 1 9
44 44 1 0
19 69 1 3
29 79 1 1
31 81 1 5
34 84 1 6
使用 append=True
告诉 to_hdf
将新块附加到同一个文件。否则,只有最后一个块保存在 file_csv.hdf
:
import os
import numpy as np
import pandas as pd
np.random.seed(2016)
df = pd.DataFrame(np.random.randint(10, size=(100, 2)), columns=list('AB'))
df.to_csv('file_csv.csv')
if os.path.exists('file_csv.hdf'): os.unlink('file_csv.hdf')
for i, df in enumerate(pd.read_csv('file_csv.csv', chunksize=50)):
print('Saving {} chunk...'.format(i), end='')
df.to_hdf('file_csv.hdf',
'file_csv',
format='table',
data_columns=True,
append=True)
print('Done!')
print(df.loc[df['A']==1])
print('-'*80)
df_hdf = pd.read_hdf('file_csv.hdf', where="A=1")
print(df_hdf)
打印
Unnamed: 0 A B
22 22 1 7
30 30 1 7
41 41 1 9
44 44 1 0
19 69 1 3
29 79 1 1
31 81 1 5
34 84 1 6