将指定标签的DataFrame列复制到新DataFrame时列错位问题求助
解决DataFrame数据导入后列错位的问题
先看你代码里的几个关键点,我发现可能有两个核心问题导致数据错位:
1. 首先是明显的笔误
你前面读取的待处理数据是newData = pd.read_csv('ChermsideStock.csv', header=0),但后面赋值的时候用的是newData3——这个变量根本没定义啊!如果实际运行没报错,那大概率是你代码里写错了变量名,先把这个修正过来,换成newData。
2. 核心问题:pandas的.loc是按索引对齐赋值,不是按行位置
这是很多新手容易踩的坑:当你用currentDataToAdd.loc[:, 'sku'] = newData.loc[:, 'Barcode']时,pandas会把两个DataFrame的索引对应起来赋值,而不是简单地把第一行放到第一行、第二行放到第二行。
举个例子:如果currentDataToAdd的索引是[0,1,2,3],但newData的索引因为某种原因变成了[1,2,3,4],那赋值后currentDataToAdd的第0行就会是空值,第1-3行对应newData的1-3行,第4行又空了,看起来就是数据整体错位了。
给你两个靠谱的解决方案:
方案一:绕过索引对齐,直接按位置赋值
用.iloc结合列位置来赋值,这样完全不看索引,只按行的顺序来填数据:
# 先修正笔误,把newData3换成newData # 找到目标列的位置,然后赋值 currentDataToAdd.iloc[:, currentDataToAdd.columns.get_loc('sku')] = newData['Barcode'].values currentDataToAdd.iloc[:, currentDataToAdd.columns.get_loc('name')] = newData['Description'].values currentDataToAdd.iloc[:, currentDataToAdd.columns.get_loc('tax_name')] = newData['Sales_Tax'].values currentDataToAdd.iloc[:, currentDataToAdd.columns.get_loc('supply_price')] = newData['Cost'].values currentDataToAdd.iloc[:, currentDataToAdd.columns.get_loc('retail_price')] = newData['Sell'].values
这里的.values会把Series转换成numpy数组,直接按顺序填充到目标列里。
方案二:重新构造DataFrame(更简洁可靠)
直接从newData中提取需要的列,重命名后对齐原currentDataToAdd的列顺序:
# 定义列名映射关系:目标列名 -> 原数据列名 column_mapping = { 'sku': 'Barcode', 'name': 'Description', 'tax_name': 'Sales_Tax', 'supply_price': 'Cost', 'retail_price': 'Sell' } # 提取需要的列并重命名 formatted_data = newData[list(column_mapping.values())].rename( columns=dict(zip(column_mapping.values(), column_mapping.keys())) ) # 确保列顺序和原currentDataToAdd完全一致 currentDataToAdd = formatted_data[currentDataToAdd.columns]
这种方式一步到位,既保证了列名正确,又能让列顺序和你原来的空DataFrame完全匹配,不会出现错位问题。
额外检查点:
- 运行
print(currentDataToAdd.columns)确认空DataFrame的列名和你预期的一致,避免读取csv时header解析错误 - 确认
newData和currentDataToAdd的行数一致,如果行数不一样,赋值后会出现NaN值,也可能看起来像错位
内容的提问来源于stack exchange,提问作者Nick Dorogavtsev
相关产品推荐
相关产品推荐

