将较大的数据帧与较小的数据帧合并(较大的数据帧作为缓冲区提供)

时间:2019-04-21 14:27:44

标签: python python-3.x pandas dask

我是熊猫的新手,我想用你的帮助。

我有两个文件,其中一个很大(100G +),我需要根据一些列进行合并。我跳过了大文件中的某些行,因此将文件作为read_csv方法的缓冲区。

对,我尝试使用熊猫。但是,当我尝试使用pandas打开文件时,该进程被操作系统终止。

with open(self.all_file, 'r') as f:
    line = f.readline()
    while line.startswith('##'):
          pos = f.tell()
          line = f.readline()
    f.seek(pos)
    return pd.read_csv(f,sep='\t')

此后,我尝试使用dask而不是pandas,但是dask无法获得缓冲区作为read_csv方法的输入,并且失败。

    return dd.read_csv(f,sep='\t')

如何打开大文件作为缓冲区并合并两个数据框?

谢谢!

1 个答案:

答案 0 :(得分:0)

IIUC:

  • 您知道要跳过的行号
  • 由于这些是VCF标头行,因此这些行仅出现在文件的开头

因此,由于it accepts keywords中的pandas.read_csv,例如 year state household_id individual_id partner_id race inter2 1980 CA 23 2 1 3 1 1980 CA 23 1 2 1 1 1990 NY 43 4 2 1 0 1990 NY 43 2 4 1 0 ,您仍然可以使用dd.read_csv

  • 有关skiprows的{​​{1}}示例,请参见this SO post
    • 如果pandas是整数(例如2),则skiprows将跳过2行
    • 如果skiprows是整数列表(例如[2,3]),则.read_csv将跳过行号(在skiprows文件中),从行号开始0

因此,您可以使用.read_csv将两个文件读入.csv文件中

.csv

然后将2个daskdf_1 = dd.read_csv('file_1.csv', skiprows=2, sep='\t') # skip line numbers 1, 2 df_2 = dd.read_csv('file_2.csv', skiprows=[10, 16]) # skip line numbers 11, 17 .merge

合并
DataFrame

如果这是您要的内容,则无需使用缓冲区。