TypeError:第一个参数必须是pandas对象的可迭代,你传递了一个“DataFrame”类型的对象

时间:2016-09-16 15:03:14

标签: python pandas

我有一个很大的数据框,我尝试将其拆分为concat之后。 我用

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'])

df2 = pd.concat(chunk, ignore_index=True)

但它返回错误

TypeError: first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"

我该如何解决?

5 个答案:

答案 0 :(得分:28)

我遇到了同样的问题,并且意识到我们必须在第一个参数中将(多个!)数据帧作为LIST传递而不是多个参数!

参考:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html

a = pd.DataFrame()
b = pd.DataFrame()
c = pd.concat(a,b) # errors out:
TypeError: first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"

c = pd.concat([a,b]) # works.

如果处理操作不要求所有数据都存在,那么就没有理由继续将所有块保存到外部阵列并仅在分块循环结束后处理所有内容:这会破坏整个目的分块。我们使用chunksize是因为我们想在每个块 处理 并释放下一个块的内存。

就OP的代码而言,他们需要创建另一个空数据帧并将块连接到那里。

df3 = pd.DataFrame() # create empty df for collecting chunks
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。

答案 1 :(得分:4)

IIUC你想要以下内容:

df2 = pd.read_csv('et_users.csv', header=None, names=names2, chunksize=100000)
chunks=[]
for chunk in df2:
    chunk['ID'] = chunk.ID.map(rep.set_index('member_id')['panel_mm_id'])
    chunks.append(chunk)

df2 = pd.concat(chunks, ignore_index=True)

您需要将每个块附加到列表中,然后使用concat将它们全部连接起来,我认为ignore_index可能没有必要,但我可能错了

答案 2 :(得分:1)

就像他们所说的一样,您需要将其作为列表传递。同样,在使用concat之前,可能有助于确保它位于DataFrame中。

chunks = pd.DataFrame(chunks)
df2 = pd.concat([chunks], ignore_index=True)

答案 3 :(得分:0)

最后一行必须采用以下格式:

df2=pd.concat([df1,df2,df3,df4,...], ignore_index=True)

事情是要连接的数据帧需要作为列表/元组传递。

答案 4 :(得分:0)

finalexcelsheet = pd.DataFrame()

for file in filenames:
    df = pd.read_excel(file, sheet_name='DL PRB')
    finalexcelsheet = finalexcelsheet.append(
        df, ignore_index=True)

# finalexcelsheet dataframe contain all files data.