如何在Pandas多列DataFrame中为各列添加差值计算新列?
问题描述
现有如下结构的Pandas DataFrame:
| date | Col.A | Col.B | Col.C | ... |
|---|---|---|---|---|
| 2022 | 1 | 1 | 1 | ... |
| 2023 | 2 | 2 | 2 | ... |
| 2024 | 3 | 3 | 3 | ... |
需要为每一列添加对应的差值计算列,最终效果如下:
| date | Col.A | Diff Col.A | Col.B | Diff Col.B | Col.C | Diff Col.C | ... |
|---|---|---|---|---|---|---|---|
| 2022 | 1 | nan | 1 | nan | 1 | nan | ... |
| 2023 | 2 | 1 | 2 | 1 | 2 | 1 | ... |
| 2024 | 3 | 1 | 3 | 1 | 3 | 1 | ... |
尝试了以下代码但未达到预期:
df = pd.read_excel('example.xlsx', header=0).set_index(['date']) df.diff()
解决方案
你的代码仅计算了差值但未与原数据合并,且将date设为索引后会导致它不再作为普通列显示。可以通过以下步骤实现需求:
- 读取数据时保留
date为普通列,避免设为索引; - 对非
date列计算差值,并给差值列命名为Diff 原列名; - 将原数据与差值数据按原列+差值列的交替顺序合并。
完整代码示例
import pandas as pd # 读取Excel文件,date作为普通列保留 df = pd.read_excel('example.xlsx', header=0) # 计算所有非date列的差值,并重命名差值列 diff_columns = df.drop('date', axis=1).diff().rename(columns=lambda col_name: f'Diff {col_name}') # 构建交替的列顺序:原列后紧跟对应差值列 ordered_columns = [] for col in df.drop('date', axis=1).columns: ordered_columns.append(col) ordered_columns.append(f'Diff {col}') # 合并数据并按指定顺序排列列 final_df = pd.concat([df[['date']], df.drop('date', axis=1), diff_columns], axis=1) final_df = final_df[['date'] + ordered_columns] # 查看结果 print(final_df)
代码说明
df.drop('date', axis=1).diff():排除date列后,对剩余列计算当前行与前一行的差值,符合示例中的计算逻辑;rename(columns=lambda col_name: f'Diff {col_name}'):给差值列添加统一前缀,方便区分原列与差值列;- 构建
ordered_columns是为了保证原列和对应的差值列相邻,匹配你想要的输出结构; pd.concat([...], axis=1):按列合并原数据和差值数据,最后通过列索引重新排序得到目标结构。
如果之前已将date设为索引,可先执行df.reset_index(inplace=True)将其转回普通列,再执行上述步骤。
内容的提问来源于stack exchange,提问作者SebastianHeeg
相关产品推荐
相关产品推荐

