如何合并Pandas DataFrame中长度不同的三个Series?
解决Pandas合并不同长度Series的问题
一、先解决pd.concat的报错问题
你遇到的TypeError是因为pd.concat的第一个参数必须是可迭代的Pandas对象集合(比如列表、元组),直接传入两个Series不符合参数要求。
正确的concat写法
假设你已提取出三个需要的Series:
# 从主表提取numSv msg_numSv = 主表['numSv'] # 从子表提取_iTOW和svDataSvId sv_iTOW = 子表['_iTOW'] sv_svId = 子表['svDataSvId'] # 将Series放入列表后传入concat x = pd.concat([msg_numSv, sv_iTOW, sv_svId], axis=1)
axis=1表示按列拼接,默认是按行拼接(axis=0)- 这种方式会按索引对齐,长度不一致的位置会填充
NaN,但可能不符合你的业务关联需求
二、基于业务关联的合理合并方案
从数据结构来看,子表的_parentMessageIndex对应主表的_messageIndex,且两张表都有_iTOW字段,这才是正确的关联依据,应该用merge匹配数据而非简单拼接:
步骤1:提取主表关联字段与目标字段
# 从主表取出关联用字段和需要的numSv main_selected = 主表[['_messageIndex', '_iTOW', 'numSv']]
步骤2:关联子表与主表
# 按_parentMessageIndex和_iTOW双字段匹配,保留子表所有行(左连接) merged_df = pd.merge( 子表, main_selected, left_on=['_parentMessageIndex', '_iTOW'], right_on=['_messageIndex', '_iTOW'], how='left' )
步骤3:提取最终需要的三个字段
# 获取目标字段集合 result = merged_df[['numSv', '_iTOW', 'svDataSvId']]
这种方式能保证子表每一行都匹配到对应主表的numSv值,符合业务逻辑。
三、若需忽略索引直接按行号拼接
如果不需要业务关联,仅想按行号顺序对齐三个Series(忽略原索引),可重置索引后再拼接:
x = pd.concat( [msg_numSv.reset_index(drop=True), sv_iTOW.reset_index(drop=True), sv_svId.reset_index(drop=True)], axis=1 )
reset_index(drop=True)会丢弃原索引,用连续自增索引对齐行
内容的提问来源于stack exchange,提问作者Kapil
相关产品推荐
相关产品推荐

