循环创建编号Pandas DataFrame报错:传递项数不符问题排查
Pandas循环创建带编号列报错:"Wrong number of items passed 4, placement implies 1"
问题描述
你尝试从名称列表创建带编号列的DataFrame,代码如下:
tickers = ['IBM US Equity', 'APL US Equity'] for num, ticker in enumerate(tickers, start=1): df[num] = df.loc[ticker] print(df[num])
其中df是一个以tickers为索引的Pandas DataFrame。单独执行以下代码能得到预期结果:
df1 = df.loc['IBM US Equity'] print(df1)
但使用循环时却报错:"Wrong number of items passed 4, placement implies 1"。
错误原因
核心问题是维度不匹配:
df.loc[ticker]返回的是一个Series(对应原df中的一行数据),它的长度等于原df的列数(这里是4)。- 当你执行
df[num] = 这个Series时,Pandas会认为你要给原df添加一个新列,而新列需要的是长度等于原df行数的数据,但你传入的Series长度是原df的列数(4),和行数不匹配,因此触发了维度错误。 - 单独执行时只是打印这个Series,没有赋值操作,所以不会触发维度检查,自然没问题。
解决方案
你可以通过两种方式实现需求:
方法1:转置原DataFrame(更简洁)
直接提取目标行后转置,再重命名列即可:
import pandas as pd tickers = ['IBM US Equity', 'APL US Equity'] # 提取指定行,转置后行索引变为原列名,再重置索引 new_df = df.loc[tickers].T.reset_index(drop=True) # 给列设置编号1、2... new_df.columns = range(1, len(tickers)+1) print(new_df)
方法2:循环中调整维度(保留循环逻辑)
把提取的行转成适合作为列的数据,比如用.values获取值数组:
import pandas as pd tickers = ['IBM US Equity', 'APL US Equity'] new_df = pd.DataFrame() # 创建空DataFrame存储结果 for num, ticker in enumerate(tickers, start=1): # 把行数据转成列数据添加到新df中 new_df[num] = df.loc[ticker].values print(new_df)
内容的提问来源于stack exchange,提问作者mt1111
相关产品推荐
相关产品推荐

