You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量处理Pandas月度DataFrame切片并执行重复操作

动态处理月度Pandas DataFrame的解决方案

问题背景

现有两个Pandas DataFrame:

  • df_a_number:包含月度数值列
  • df_b_letter:包含月度字符列

需要对每个月度生成对应切片,执行以下操作后输出独立的月度DataFrame,要求无需逐个定义月度DataFrame,方案需灵活适配周期变化:

  1. 计算-Diff列(当月数值与上月数值的差值)
  2. 合并对应月度的-Letter列
  3. 输出前对数据进行过滤

输入示例

df_a_number

Index   21-Nov  21-Dec  22-Jan  22-Feb
John    2       3       1       5   
Anna    1       4       3       8

df_b_letter

Index   21-Nov  21-Dec  22-Jan  22-Feb
John    a       f       j       p   
Anna    b       b       w       g

期望输出:每个月度对应一个DataFrame(如df_dec、df_jan等),包含索引、当月数值、Diff、Letter列,且经过过滤。


解决方案

步骤1:统一数据结构

先确保两个DataFrame的索引和月度列完全匹配,避免后续合并出错:

import pandas as pd

# 将Index列设为行索引(如果原始数据中Index是普通列)
df_a_number = df_a_number.set_index('Index')
df_b_letter = df_b_letter.set_index('Index')

# 校验月度列一致性
assert list(df_a_number.columns) == list(df_b_letter.columns), "两个DataFrame的月度列不匹配"

步骤2:遍历月度动态处理

用字典存储生成的月度DataFrame(比逐个定义变量更整洁易维护),从第二个月度开始遍历(第一个月度无上月数据,可按需单独处理):

# 存储结果的字典
monthly_dfs = {}
# 获取按时间排序的月度列列表
months = df_a_number.columns.tolist()

for i in range(1, len(months)):
    current_month = months[i]
    prev_month = months[i-1]
    
    # 提取当月/上月数值列并命名
    current_vals = df_a_number[current_month].rename('Current_Value')
    prev_vals = df_a_number[prev_month].rename('Previous_Value')
    
    # 计算当月与上月的差值
    diff_col = (current_vals - prev_vals).rename(f'{current_month}_Diff')
    
    # 提取当月字符列
    letter_col = df_b_letter[current_month].rename(f'{current_month}_Letter')
    
    # 合并所有列
    temp_df = pd.concat([current_vals, diff_col, letter_col], axis=1)
    
    # 数据过滤(示例:保留差值大于0的行,可根据需求修改规则)
    filtered_df = temp_df[temp_df[diff_col.name] > 0]
    
    # 生成简洁的月度键名(如'dec'、'jan'),存入字典
    month_short = current_month.split('-')[1].lower()
    monthly_dfs[f'df_{month_short}'] = filtered_df

步骤3:访问结果

通过字典键直接调用对应月度的DataFrame:

# 查看12月结果
print(monthly_dfs['df_dec'])
# 查看1月结果
print(monthly_dfs['df_jan'])

可选:生成全局变量(不推荐)

如果一定要生成df_dec这类全局变量,可使用globals():

for df_name, df in monthly_dfs.items():
    globals()[df_name] = df

# 直接访问df_dec
print(df_dec)

示例输出(df_dec)

Current_Value 21-Dec_Diff 21-Dec_Letter
Index                                           
John                3           1              f
Anna                4           3              b

内容的提问来源于stack exchange,提问作者Zaphod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:32:02