【问题标题】:Python: iteratively add to dataframePython:迭代地添加到数据框
【发布时间】:2018-05-18 22:15:57
【问题描述】:

我有以下代码:

for state in state_list:
    state_df = pd.DataFrame()
    for df in pd.read_csv(tax_sample,sep='\|\|', engine='python', dtype = tax_column_types, chunksize = 10, nrows = 100):
        state_df = pd.concat(state_df,df[df['state'] == state])
state_df.to_csv('property' + state + '.csv')

我的数据集非常大,我将它分成块(实际上这些块会大于 10 obs)。我正在获取每个块并检查状态是否与列表中的特定状态匹配,如果是,则将其存储在数据框中并保存下来。 简而言之,我正在尝试获取一个包含许多不同状态的数据帧并将其分解为多个数据帧,每个数据帧只有一个状态并保存到 CSV。

但是,上面的代码给出了错误:

TypeError: first argument must be an iterable of pandas objects, you 传递了一个“DataFrame”类型的对象

知道为什么吗?

谢谢,

迈克

【问题讨论】:

标签: python pandas loops


【解决方案1】:

考虑iterating off the chunks,每次运行.isin[] 过滤state_list,但保存在字典或列表之类的容器中。如评论所述,避免循环扩展数据帧的开销。

之后,在容器上与pd.concat 绑定,然后在 state 字段上运行循环的groupby 以单独输出每个文件。

df_list = []

reader = pd.read_csv(tax_sample, sep='\|\|', engine='python', 
                     dtype=tax_column_types, chunksize=10, nrows=100)

for chunk in reader:
   tmp = chunk[chunk['state'].isin(state_list)]    
   df_list.append(tmp)

master_df = pd.concat(df_list)

for g in master_df.groupby('state'):
    g[1].to_csv('property' + g[0] + '.csv')

【讨论】:

  • 感谢您的回复。我不太明白上面发生了什么。我看到我们正在分块读取文件,因此“阅读器”包含 10 个块。但这如何减少所需的内存量?是不是全部仍然存储在内存中,而只是存储在多个数据帧中?
  • 你试过代码和测试性能了吗?如果您阅读链接,则可以避免一次读取整个数据文件的内存占用。它类似于 python 的 readlines() vs looping over read object 文本文件。内存效率问题不在于 RAM 中保存的数据大小,而是操作系统何时/如何为数据分配 RAM。
  • 是的,我已经尝试运行它,但它仍然会引发内存问题。我分成 1,000 个块,有几百万行。
  • 内存问题出现在哪一行?通过注释掉行来检查。如果您只是运行reader= 怎么办?那么for chunk 循环呢?我想知道pd.concat() 是不是问题,甚至是groupby()。尝试在命令行而不是任何 IDE (Spyder/PyCharm) 上运行。
  • 现在正忙着运行,谢谢,会告诉你我在哪里遇到问题
猜你喜欢
  • 2019-08-05
  • 2015-09-06
  • 2020-09-24
  • 2015-08-28
  • 2022-01-13
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多