【问题标题】:Averaging large csv files平均大型 csv 文件
【发布时间】:2018-12-11 10:24:44
【问题描述】:

我有两个使用 pd.read_csv 作为迭代器加载的大型 csv 文件。这些文件足够大,无法放入内存:

df1 = pd.read_csv('file1.csv', chunksize=5000000, iterator=True)
df2 = pd.read_csv('file2.csv', chunksize=5000000, iterator=True)

文件的内容类似于:

df1

Id   val1   val2   val3
1    0.5    0.45   0.13
2    0.11   0.18   0.20

df2

Id   val1   val2   val3
1    0.4    0.5    0.20
2    0.13   0.30   0.22

Id 列对于两个文件具有相同的值。列名也是如此。我想要做的是对 val 列中的值取元素平均值,并将它们放在另一个具有相同 Id 列的 csv 中。

所以这个输出看起来像:

Id   val1   val2   val3
1    0.45   0.475  0.165
2    0.12   0.24   0.21

关于如何解决这个问题有什么想法吗? read_csv 是正确的方法,还是我应该改用 dask 之类的方法?我当时的想法是同时迭代迭代器并采用块的方法,然后将它们附加到另一个 csv 文件,但我不确定这是否真的可以用 for 循环之类的东西来实现

【问题讨论】:

    标签: python pandas csv


    【解决方案1】:

    我还没有尝试过下面的代码,但我想你可以看到我用它去哪里了。您可以使用 skiprows 和 nrows 功能。我觉得 dask 可能是“正确”的做法。我以前用过一点,他们的api看起来很容易使用。

    import pandas as pd
    
    result = []
    
    MAX_ROW_NO= 1000
    STEP_SIZE = 10
    
    for i in range(0,M AX_ROW_NO, STEP_SIZE):
        temp1 = pd.read_csv("file1.csv",skiprows=i,nrows=STEP_SIZE)
        temp2 = pd.read_csv("file2.csv",skiprows=i,nrows=STEP_SIZE)
        temp_avg = (temp1 + temp2)/2
        result.append(temp_avg)
    
    df_avg = pd.concat(result)
    

    编辑:我认为 dask 解决方案看起来会更整洁一些。我认为它看起来像:

    import dask.dataframe as dd
    df1 = dd.read_csv('file1.csv')
    df2 = dd.read_csv('file.csv')
    
    df_avg = (df1 + df2)/2
    
    df_avg.to_csv("file_avg.csv")
    

    我还没有尝试过,但是 dask 数据帧命令类似于 pandas 并且易于使用。

    【讨论】:

      猜你喜欢
      • 2017-04-20
      • 2015-03-31
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 2015-12-01
      • 2016-05-05
      相关资源
      最近更新 更多