使用pyspark.pandas拼接DataFrame时触发TypeError问题求助
问题:使用pyspark.pandas.concat拼接pandas DataFrame时报TypeError
错误信息
TypeError: cannot concatenate object of type 'list; only ps.Series and ps.DataFrame are valid
问题代码及类型验证
import pyspark.pandas as ps split_col = split_col.toPandas() split_col2 = split_col2.toPandas() dfNew = ps.concat([split_col,split_col2],axis=1,ignore_index=True)
报错栈:
TypeError Traceback (most recent call last) /tmp/ipykernel_1455538/463168233.py in <module> 2 split_col = split_col.toPandas() 3 split_col2 = split_col2.toPandas() ----> 4 dfNew = ps.concat([split_col,split_col2],axis=1,ignore_index=True) /home/anaconda3/envs/virtenv/lib/python3.10/site-packages/pyspark/pandas/namespace.py in concat(objs, axis, join, ignore_index, sort) 2464 for obj in objs: 2465 if not isinstance(obj, (Series, DataFrame)): -> 2466 raise TypeError( 2467 "cannot concatenate object of type " 2468 "'{name}" TypeError: cannot concatenate object of type 'list; only ps.Series and ps.DataFrame are valid
类型验证结果:
type(split_col) # pandas.core.frame.DataFrame type(split_col2) # pandas.core.frame.DataFrame
解决建议
原因分析
ps.concat是pyspark.pandas库专属的拼接函数,仅接受该库自身的ps.DataFrame或ps.Series对象作为参数。但你通过toPandas()得到的是原生pandas的pd.DataFrame,二者类型不匹配,因此触发报错。报错信息里的'list'属于源码字符串拼接的小问题,核心矛盾是对象类型不符合要求。
方案1:转换为pyspark.pandas DataFrame后拼接
将原生pandas DataFrame转为pyspark.pandas的DataFrame,再执行拼接:
import pyspark.pandas as ps split_col = split_col.toPandas() split_col2 = split_col2.toPandas() # 转换为pyspark.pandas格式的DataFrame ps_df1 = ps.from_pandas(split_col) ps_df2 = ps.from_pandas(split_col2) # 执行横向拼接 dfNew = ps.concat([ps_df1, ps_df2], axis=1, ignore_index=True)
方案2:直接使用原生pandas的concat函数
既然已经将数据转为原生pandas DataFrame,直接用原生pandas的拼接函数更高效:
import pandas as pd split_col = split_col.toPandas() split_col2 = split_col2.toPandas() # 用pd.concat完成横向拼接 dfNew = pd.concat([split_col, split_col2], axis=1, ignore_index=True)
内容的提问来源于stack exchange,提问作者kiyga
相关产品推荐
相关产品推荐

