【问题标题】:Operations on a very large csv with pandas使用 pandas 对非常大的 csv 进行操作
【发布时间】:2017-04-30 12:25:55
【问题描述】:

我一直在对 csv 文件使用 pandas 以从中获取一些值。我的数据如下所示:

"A",23.495,41.995,"this is a sentence with some words"
"B",52.243,0.118,"More text but contains WORD1"
"A",119.142,-58.289,"Also contains WORD1"
"B",423.2535,292.3958,"Doesn't contain anything of interest"
"C",12.413,18.494,"This string contains WORD2"

我有一个简单的脚本来读取 csv 并按组创建 WORD 的频率,因此输出如下:

group freqW1 freqW2
A     1      0
B     1      0
C     0      1

然后对这些值做一些其他的操作。现在的问题是我必须处理无法保存在内存中的非常大的 csv 文件(20+ GB)。我尝试了 pd.read_csv 中的 chunksize=x 选项,但因为 'TextFileReader' 对象不可下标,我无法对块进行必要的操作。

我怀疑有一些简单的方法可以遍历 csv 并做我想做的事。

我的代码是这样的:

df = pd.read_csv("csvfile.txt", sep=",", header = None,names=
["group","val1","val2","text"])
freq=Counter(df['group'])
word1=df[df["text"].str.contains("WORD1")].groupby("group").size()
word2=df[df["text"].str.contains("WORD2")].groupby("group").size()
df1 = pd.concat([pd.Series(freq),word1,word2], axis=1)

outfile = open("csv_out.txt","w", encoding='utf-8')
df1.to_csv(outfile, sep=",")
outfile.close() 

【问题讨论】:

    标签: python csv pandas


    【解决方案1】:

    您可以在read_csv 调用中指定chunksize 选项。见here for details

    或者,您可以使用 Python csv 库并创建自己的 csv Reader 或 DictReader,然后使用它以您选择的任何块大小读取数据。

    【讨论】:

      【解决方案2】:

      好的,我误解了 chunk 参数。我通过这样做解决了它:

      frame = pd.DataFrame()
      chunks = pd.read_csv("csvfile.txt", sep=",", header = None,names=
      ["group","val1","val2","text"],chunksize=1000000)
      for df in chunks: 
          freq=Counter(df['group'])
          word1=df[df["text"].str.contains("WORD1")].groupby("group").size()
          word2=df[df["text"].str.contains("WORD2")].groupby("group").size()
          df1 = pd.concat([pd.Series(freq),word1,word2], axis=1)
          frame = frame.add(df1,fill_value=0)
      
      outfile = open("csv_out.txt","w", encoding='utf-8')
      frame.to_csv(outfile, sep=",")
      outfile.close() 
      

      【讨论】:

        猜你喜欢
        • 2016-12-15
        • 1970-01-01
        • 2017-02-24
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 2022-08-06
        • 2012-10-27
        • 2015-08-12
        相关资源
        最近更新 更多