基于日期信息重塑Pandas DataFrame
用Pandas重排DataFrame实现日期映射和列转行需求
先看你的原始DataFrame结构:
import pandas as pd # 构造原始数据 data = { 'Current_date': ['19/10/2021', '19/10/2021', '19/10/2021', '19/10/2021'], 'ID': [11, 11, 12, 13], 'Current_date+1': [0.9, 0.7, 1.0, 0.8], 'Current_Date+2': [0.8, 0.6, 1.5, 0.5] } df = pd.DataFrame(data)
对应的原始表:
| Current_date | ID | Current_date+1 | Current_Date+2 |
|---|---|---|---|
| 19/10/2021 | 11 | 0.9 | 0.8 |
| 19/10/2021 | 11 | 0.7 | 0.6 |
| 19/10/2021 | 12 | 1.0 | 1.5 |
| 19/10/2021 | 13 | 0.8 | 0.5 |
你的需求是把Current_date+1和Current_Date+2这两列转成行,同时根据列名给Current_date加上对应天数得到新的Date列,最后映射数值到Value列。
解决方案步骤
我会用Pandas的melt函数来做列转行,再处理日期计算,具体代码如下:
# 1. 先把日期列转成datetime类型,方便后续计算 df['Current_date'] = pd.to_datetime(df['Current_date'], format='%d/%m/%Y') # 2. 使用melt进行列转行,保留Current_date和ID作为标识列 melted_df = df.melt( id_vars=['Current_date', 'ID'], value_vars=['Current_date+1', 'Current_Date+2'], var_name='Date_offset', value_name='Value' ) # 3. 根据Date_offset列计算对应的Date列 melted_df['Date'] = melted_df.apply( lambda row: row['Current_date'] + pd.Timedelta(days=1) if row['Date_offset'] == 'Current_date+1' else row['Current_date'] + pd.Timedelta(days=2), axis=1 ) # 4. 调整列顺序,并且把日期转回原格式(如果需要的话) result_df = melted_df[['Current_date', 'ID', 'Date', 'Value']] result_df['Current_date'] = result_df['Current_date'].dt.strftime('%d/%m/%Y') result_df['Date'] = result_df['Date'].dt.strftime('%d/%m/%Y') # 查看结果 print(result_df)
运行后得到的结果就是你想要的结构:
| Current_date | ID | Date | Value |
|---|---|---|---|
| 19/10/2021 | 11 | 20/10/2021 | 0.9 |
| 19/10/2021 | 11 | 20/10/2021 | 0.7 |
| 19/10/2021 | 12 | 20/10/2021 | 1.0 |
| 19/10/2021 | 13 | 20/10/2021 | 0.8 |
| 19/10/2021 | 11 | 21/10/2021 | 0.8 |
| 19/10/2021 | 11 | 21/10/2021 | 0.6 |
| 19/10/2021 | 12 | 21/10/2021 | 1.5 |
| 19/10/2021 | 13 | 21/10/2021 | 0.5 |
代码解释
- 转datetime类型:把字符串格式的日期转成Pandas的datetime类型,这样才能方便地进行天数加法操作。
- melt函数:这是Pandas处理宽表转长表的常用工具,
id_vars指定要保留的标识列,value_vars指定要转成行的目标列,var_name和value_name分别设置新生成的列名。 - 日期计算:用
apply结合lambda函数,根据Date_offset的取值给原始日期加1天或2天,生成目标Date列。 - 调整列顺序和格式:最后把列调整成你需要的顺序,并且把datetime类型转回原来的字符串格式(如果不需要格式化可以省略这一步)。
内容的提问来源于stack exchange,提问作者Hiwot
相关产品推荐
相关产品推荐

