如何批量处理Pandas月度DataFrame切片并执行重复操作
动态处理月度Pandas DataFrame的解决方案
问题背景
现有两个Pandas DataFrame:
df_a_number:包含月度数值列df_b_letter:包含月度字符列
需要对每个月度生成对应切片,执行以下操作后输出独立的月度DataFrame,要求无需逐个定义月度DataFrame,方案需灵活适配周期变化:
- 计算
-Diff列(当月数值与上月数值的差值) - 合并对应月度的
-Letter列 - 输出前对数据进行过滤
输入示例
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
相关产品推荐
相关产品推荐

