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

Pet*_*rov 12 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)
Run Code Online (Sandbox Code Playgroud)

但它返回一个错误

TypeError: first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Nik*_* VJ 35

我遇到了同样的问题,并且意识到我们必须在第一个参数中将(多个!)数据帧作为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.
Run Code Online (Sandbox Code Playgroud)

如果处理操作不需要存在所有数据,那么就没有理由继续将所有块保存到外部阵列并仅在分块循环结束后处理所有内容:这会破坏分块的整个目的.我们使用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)
Run Code Online (Sandbox Code Playgroud)

但是,我想重申,为了避免将整个CSV的所有行构建到单个DataFrame中而发明了分块,因为这是在处理大型CSV时导致内存不足错误的原因.我们不想只是将错误从pd.read_csv()线路转移到pd.concat()线路上.我们需要手艺的方式来干掉我们的批量数据处理的内部的分块循环.在我自己的用例中,我使用df查询消除了大多数行,并且仅连接所需的行数较少,因此最终的df远小于原始的csv.


EdC*_*ica 6

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)
Run Code Online (Sandbox Code Playgroud)

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


Dim*_*jan 6

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

df2=pd.concat([df1,df2,df3,df4,...], ignore_index=True)
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

IE

chunks = pd.DataFrame(chunks)
df2 = pd.concat([chunks], ignore_index=True)
Run Code Online (Sandbox Code Playgroud)