Pandas合并12个月销售数据遇NaN问题,寻求替代解决方案
合并2019年月度销售数据的可行方法
首先,你用pd.concat出现NaN值,大概率是因为各文件的列名看似一致,实际存在差异(比如大小写、首尾空格、部分文件多列/少列)。先检查所有数据框的列名是否完全匹配:
# 检查所有数据框的列名 for idx, df in enumerate([sales_1, sales_2, sales_3, sales_4, sales_5, sales_6, sales_7, sales_8, sales_9, sales_10, sales_11, sales_12], 1): print(f"第{idx}个月数据列名: {df.columns.tolist()}")
如果发现列名不一致,先统一标准化:
# 去除列名首尾空格并转为小写(按需调整) for df in [sales_1, sales_2, sales_3, sales_4, sales_5, sales_6, sales_7, sales_8, sales_9, sales_10, sales_11, sales_12]: df.columns = df.columns.str.strip().str.lower()
以下是几种可行的合并方法:
方法1:修正后的pd.concat(推荐)
确保列名一致后,直接按行合并,添加ignore_index=True重置索引:
all_sales = pd.concat( [sales_1, sales_2, sales_3, sales_4, sales_5, sales_6, sales_7, sales_8, sales_9, sales_10, sales_11, sales_12], axis=0, # 按行合并(默认值,可省略) ignore_index=True )
如果部分文件有额外列,只想保留所有文件共有的列,可添加join='inner':
all_sales = pd.concat( [sales_1, sales_2, sales_3, sales_4, sales_5, sales_6, sales_7, sales_8, sales_9, sales_10, sales_11, sales_12], axis=0, ignore_index=True, join='inner' )
方法2:使用append(兼容旧版Pandas)
虽然append已被Pandas官方标记为废弃,但在旧版本中仍可使用:
all_sales = sales_1.append( [sales_2, sales_3, sales_4, sales_5, sales_6, sales_7, sales_8, sales_9, sales_10, sales_11, sales_12], ignore_index=True )
方法3:批量读取+合并(更简洁高效)
避免重复编写12次read_csv,用循环批量处理所有文件:
import os import pandas as pd # 替换为你的CSV文件所在文件夹路径 folder_path = "./" # 获取所有月度销售文件 sales_files = [f for f in os.listdir(folder_path) if f.startswith("Sales_") and f.endswith(".csv")] # 批量读取并标准化列名 dfs = [] for file in sales_files: df = pd.read_csv(os.path.join(folder_path, file)) df.columns = df.columns.str.strip().str.lower() dfs.append(df) # 合并所有数据 all_sales = pd.concat(dfs, axis=0, ignore_index=True)
方法4:标记数据来源的合并(可选)
如果需要保留每个数据的月度来源,可添加keys参数:
months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] all_sales = pd.concat( [sales_1, sales_2, sales_3, sales_4, sales_5, sales_6, sales_7, sales_8, sales_9, sales_10, sales_11, sales_12], keys=months, axis=0 )
这样可以通过all_sales.loc["January"]快速筛选对应月份的数据。
内容的提问来源于stack exchange,提问作者Adejuwon Boboye
相关产品推荐
相关产品推荐

