【问题标题】:creating a dictionary for big size csv data files using pandas使用 pandas 为大尺寸 csv 数据文件创建字典
【发布时间】:2020-01-20 08:19:02
【问题描述】:

我正在尝试为一个大尺寸的 csv 文件创建一个字典文件,该文件被分成要处理的块,但是当我创建字典时它只是为一个夹头做它,当我尝试附加它时它将 epmty 数据帧传递给新的 df。这是我使用的代码

wdata = pd.read_csv(fileinput, nrows=0,).columns[0]
skip = int(wdata.count(' ') == 0)
dic = pd.DataFrame()
for chunk in pd.read_csv(fileinput, names=['sentences'], skiprows=skip, chunksize=1000):
    dic_tmp = (chunk['sentences'].str.split(expand=True).stack().value_counts().rename_axis('word').reset_index(name='freq'))


    dic.append(dic_tmp)
dic.to_csv('newwww.csv', index=False)

如果我保存的 dic_tmp 只是一个块的字典而不是整个集合,并且 dic 需要大量时间来处理但最后返回空数据帧,我的代码有什么错误吗?

输入 csv 就像

输出 csv 就像

预期的输出应该是

所以它不会将块添加在一起,它只是粘贴新块,无论前一个块或 csv 中有什么。

【问题讨论】:

  • 对不起,你真的应该谨慎使用 python 术语(例如“字典”)。您在这里所做的是数据帧的分块处理,您将这些数据帧重新合并到一个单独的 DF 中。您能否提供一个您正在加载的表格的示例?
  • @OlegO 我添加了一些例子希望你现在能更好地理解我

标签: python pandas csv chunking


【解决方案1】:

为了将列拆分为单词并计算出现次数: df['sentences'].apply(lambda x: pd.value_counts(x.split(" "))).sum(axis=0)

from collections import Counter result = Counter(" ".join(df['sentences'].values.tolist()).split(" ")).items()

两者似乎都同样慢,但可能比你的方法更好。 取自这里: Count distinct words from a Pandas Data Frame

【讨论】:

  • 非代码正在执行所需的输出第一个代码中有值计数,除非我将 str replace 和 stack 放在它前面以更改数据帧的类型,否则第二个代码将转换它到一个列表。我想要的是在获取每个块之后检查前一个块是否存在单词如果它是新的则增加单词的频率将它附加到文件的末尾并转到下一个块
  • @programmingfreak 我自己检查了第一个方法,它确实创建了一个带有计数的可用单词列表(尽管未排序,但这无关紧要,我猜),即正是你在“预期的输出应该是”。从你的解释我真的不明白你的问题是什么。
【解决方案2】:

我看到的几个问题是

  1. 为什么要读取 csv 文件两次? 第一次在这里wdata = pd.read_csv(fileinput, nrows=0,).columns[0],第二次在for 循环中。

  2. 如果您不进一步使用组合数据框。我认为最好以追加模式将块写入 csv 文件,如下所示

for chunk in pd.read_csv(fileinput, names=['sentences'], skiprows=skip, chunksize=1000):
    dic_tmp = (chunk['sentences'].str.split(expand=True).stack().value_counts().rename_axis('word').reset_index(name='freq'))
    dic_tmp.to_csv('newwww.csv', mode='a', header=False)

【讨论】:

  • 我先读了两次它检查它是否有标题,如果有它会删除它然后命名标题句子,因为它是基于用户的输入,所以我不假设用户输入将是固定标题
  • 好的。明白了。尝试第二点的优化。可能有帮助
  • 它给出了错误的输出,不幸的是,如果它在以前的块中已经可用,它不会添加到一个单词,它只会再次打印它作为一个新的。
  • 如果您能提供更多帮助,我已经修改了问题@abhilb
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 2012-12-15
相关资源
最近更新 更多