如何在pandas中结构化并重塑格式损坏的DataFrame?
你这个问题的核心是原始DataFrame的第0行是错位的表头占位数据,实际业务数据从第1行开始,同时原本的dateID列实际存储的是sourceOfData字段的取值,表头中的日期字符串才是dateID的取值,直接用melt即可完成转换,完整处理代码如下:
import pandas as pd # 你的原始DataFrame whatIHave = {'countryName': ['','United States','Canada'], 'provinceName': ['','New York','Ontario'], 'productID': ['','35','55'], 'productName': ['', 'Sugar', 'Corn'], 'dateID': ['sourceOfData', 'CommissionAgent1', 'CommissionAgent1'], '2021-09-06': ['productPrice','2.6$','2.6$'], '2021-09-07': ['productPrice','5.5$','5.5$'], '2021-09-08': ['productPrice','3.4$','3.4$'] } df_whatIHave = pd.DataFrame(whatIHave, columns = ['countryName', 'provinceName', 'productID', 'productName', 'dateID', '2021-09-06', '2021-09-07', '2021-09-08']) # 你预期的目标DataFrame,用于结果校验 whatINeed = {'countryName': ['United States','United States','United States', 'Canada', 'Canada', 'Canada'], 'provinceName': ['New York','New York','New York', 'Ontario', 'Ontario', 'Ontario'], 'productID': ['35','35','35', '55', '55', '55'], 'productName': ['Sugar', 'Sugar', 'Sugar', 'Corn', 'Corn', 'Corn'], 'sourceOfData': ['CommissionAgent1', 'CommissionAgent1', 'CommissionAgent1', 'CommissionAgent1', 'CommissionAgent1', 'CommissionAgent1'], 'dateID': ['2021-09-06', '2021-09-07', '2021-09-08', '2021-09-06', '2021-09-07', '2021-09-08'], 'productPrice': ['2.6$','5.5$','3.4$','2.6$','5.5$','3.4$'] } df_whatINeed = pd.DataFrame(whatINeed, columns = ['countryName', 'provinceName', 'productID', 'productName', 'sourceOfData', 'dateID', 'productPrice']) # 核心处理逻辑 # 1. 重命名错位的dateID列为sourceOfData df = df_whatIHave.rename(columns={'dateID': 'sourceOfData'}) # 2. 过滤掉第0行的占位表头数据,保留实际业务数据 df = df.iloc[1:].reset_index(drop=True) # 3. 宽表转长表,把日期列转为行 df_result = df.melt( id_vars=['countryName', 'provinceName', 'productID', 'productName', 'sourceOfData'], var_name='dateID', value_name='productPrice' ) # 验证结果和你预期的一致 print(df_result.equals(df_whatINeed)) # 输出True
如果你是直接从Excel文件读取得到的错位数据,可以在读Excel的时候直接跳过第一行占位表头,再手动指定列名,能减少后续处理步骤。
内容的提问来源于stack exchange,提问作者Gunner1905
相关产品推荐
相关产品推荐

