python - 如何使用 pandas 将 n 个 .csv 文件(可能是 20-30 个文件)与 1 个大 .csv 文件水平(轴 = 1)合并?

标签 python pandas csv dataframe

我有一个 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/

相关文章:

python - 如何更改 pandas groupby.agg 函数的输入参数?

python - 如何在 Pandas 中创建 DataFrame

python - 在执行之前将所有从 python 脚本触发的 shell 命令打印到控制台

python - 即使测试了所有案例,MyPy 也会给出错误 "Missing return statement"

python - 无法识别 DataFrame 中的列。关键字错误: 'Date'

python - 如何撤消 pandas 数据帧的时间序列转换?

python - 如何在 Jenkins 环境中运行不同的 tox 命令?

python - 如何使用 pyparsing 构建简单的 AST

java - 如何使用 Java 删除 Excel (csv) 工作表中的一行?

python - 将 CSV header 与 MySQL 架构列相匹配