Python:如何将偶数索引列与对应奇数列关联生成新DataFrame
解决方案
1. 模拟读取后的样本DataFrame
先模拟无表头Excel读取后的结构,还原你提到的列特征:
import pandas as pd import numpy as np # 模拟数据:偶数索引列是天数(无表头,显示Unnamed),奇数列是位置名称+对应数值 data = { 'Unnamed: 0': [1, 2, 3, np.nan, np.nan], '位置A': [10, 20, 30, np.nan, np.nan], 'Unnamed: 2': [0, 1, 4, 5, np.nan], '位置B': [5, 15, 25, 35, np.nan], 'Unnamed: 4': [2, 3, np.nan, np.nan, np.nan], '位置C': [100, 200, np.nan, np.nan, np.nan] } df = pd.DataFrame(data)
2. 核心转换逻辑
按需求生成目标DataFrame:
# 基准日期 date_value = pd.to_datetime('2023-01-01', format='%Y-%m-%d') # 存储结果行的列表 result_rows = [] # 按步长2遍历列,每一组对应「天数列+位置数值列」 for i in range(0, len(df.columns), 2): days_col = df.columns[i] pos_col = df.columns[i+1] pos_name = pos_col # 位置列名直接作为位置名称 # 过滤空值行,提取有效数据 valid_data = df[[days_col, pos_col]].dropna() # 逐行计算日期并生成结果数据 for _, row in valid_data.iterrows(): days_to_add = int(row[days_col]) target_date = date_value + pd.Timedelta(days=days_to_add) result_rows.append({ '位置名称': pos_name, '日期': target_date, '数值': row[pos_col] }) # 转换为最终DataFrame final_df = pd.DataFrame(result_rows)
3. 输出结果示例
运行后final_df的结构如下:
| 位置名称 | 日期 | 数值 |
|---|---|---|
| 位置A | 2023-01-02 | 10 |
| 位置A | 2023-01-03 | 20 |
| 位置A | 2023-01-04 | 30 |
| 位置B | 2023-01-01 | 5 |
| 位置B | 2023-01-02 | 15 |
| 位置B | 2023-01-05 | 25 |
| 位置B | 2023-01-06 | 35 |
| 位置C | 2023-01-03 | 100 |
| 位置C | 2023-01-04 | 200 |
关键说明
- 按步长2遍历列,确保每组数据对应正确的天数和位置
- 用
dropna()过滤空值行,避免无效数据混入结果 - 通过
pd.Timedelta实现日期偏移,保证日期计算精准 - 最终整合为标准结构的DataFrame,便于后续分析或导出
内容的提问来源于stack exchange,提问作者whitepanda
相关产品推荐
相关产品推荐

