我有一个 20-30 个 csv 文件,其中包含 3 列,如“id”、“col1”、“col2”、“col3”和 1 个 20GB 大小的大 csv 文件,我想分块读取这些文件并与这些较小的合并csv 文件。 较大的 csv 文件包含“id”、“name”、“zipdeails”等列。 两者都有相同序列的 ID 列, 样本看起来像
'id','name','zipdeails'
1,Ravi,2031345
2,Shayam,201344
3,Priya,20134
.........
1000,Pravn,204324
block 文件 1 看起来像
'id','col1','col2','col3'
1,Heat,,
2,Goa,Next,
3,,,Delhi
所有较小的 csv 文件都具有相同的长度(行数),但最后一个文件的长度可能较小,每个文件中都有标题。要合并的较大 csv 文件可以分解为等于这些较小文件长度的 block 所以最后一 block 看起来像
'id','col1','col2','col3'
1000,Jaipur,Week,Trip
现在输出应该如下所示
'id','name','zipdeails','col1','col2','col3'
1,Ravi,2031345,Heat,NAN,NAN
2,Shayam,201344,Goa,Next,NAN
3,Priya,20134,NAN,NAN,Delhi
.........
1000,Pravn,204324,Jaipur,Week,Trip
最佳答案
我认为你需要创建 list of DataFrame
s 表示所有小文件,然后将大文件读取到内存中并 concat
全部由 index
提供创建者 id
栏目:
import glob
#concat 30 files
files = glob.glob('files/*.csv')
dfs = [pd.read_csv(fp, index_col=['id']) for fp in files]
#if necessary
#df_big = df_big.set_index('id')
df_fin = pd.concat([df_big, dfs], axis=1)
如果 id
的顺序相同,则可以稍微修改一下解决方案所有 DataFrame 中没有重复项的值,如 1,2,3...N
参数 nrows
只读大的第一行 DataFrame
按较小数据帧的最大长度:
#concat 30 files
files = glob.glob('files/*.csv')
dfs = [pd.read_csv(fp, index_col=['a']) for fp in files]
len_max= max([x.index.max() for x in dfs])
df_big= pd.read_csv('big_df_file.csv', index_col=['id'], nrows=len_max)
df_fin = pd.concat([df_big, dfs], axis=1)
编辑:
#concat 30 files
files = glob.glob('files/*.csv')
#order of files is important for concat values -
#in first file are id = (1,100), second (101, 200)...
print (files)
#set by max rows of file
N = 100
#loop by big fileby chunk define in N
for i, x in enumerate(pd.read_csv('files/big.csv', chunksize=N, index_col=['id'])):
#added try for avoid errors if want seelct non exist file in list files
try:
df = pd.read_csv(files[i], index_col=['id'])
df1 = pd.concat([x, df], axis=1)
print (df1)
#in first loop create header in output
if i == 0:
pd.DataFrame(columns=df1.columns).to_csv('files/out.csv')
#append data to output file
df1.to_csv('files/out.csv', mode='a', header=False)
except IndexError as e:
print ('no files in list')
关于python - 如何使用 pandas 将 n 个 .csv 文件(可能是 20-30 个文件)与 1 个大 .csv 文件水平(轴 = 1)合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47669609/