我遇到了相同的问题,后来才意识到我们必须将(多个!)数据框作为列表传递给第一个参数,而不是作为多个参数传递!
参考资料:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html
a = pd.DataFrame()
b = pd.DataFrame()
c = pd.concat(a,b)
TypeError: first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"
c = pd.concat([a,b])
如果处理操作不需要所有数据都存在,那么就没有理由将所有块保存到外部数组中并且只在拆块循环结束后一次性处理所有内容:这违反了拆块的整个目的。我们使用拆块是因为我们想要在
每个块上进行处理,并释放内存以供下一个块使用。
关于 OP 的代码,他们需要创建另一个空的数据帧并将块串联到其中。
df3 = pd.DataFrame()
df2 = pd.read_csv('et_users.csv', header=None, names=names2, chunksize=100000)
for chunk in df2:
chunk['ID'] = chunk.ID.map(rep.set_index('member_id')['panel_mm_id'])
df3 = pd.concat([df3,chunk], ignore_index=True)
print(df3)
然而,我想再次强调,块处理技术的发明正是为了避免将整个 CSV 的所有行构建成单个 DataFrame,因为这会在处理大型 CSV 时导致内存不足错误。我们不希望仅仅将错误从 pd.read_csv()
移到 pd.concat()
。我们需要找到方法来在块循环中完成大部分数据处理任务。在我的用例中,我使用 df 查询消除了大部分行,并只连接了较少所需的行,因此最终的 df 比原始 csv 小得多。
for chunk in df2: chunk['ID'] = chunk.ID.map(rep.set_index('member_id')['panel_mm_id'])
您的意图是什么?您想创建一些新的df吗?您应该将每个块附加到某个列表中,然后调用concat
。 - EdChumchunk['ID']
中的值。接下来,我应该使用chunk = chunk.dropna()
,然后我应该连接块。 - Petr Petrov