如何动态命名DataFrame?Python Pandas实现指导
按列拆分DataFrame并存储到字典中
问题背景
有如下结构的DataFrame(可通过以下代码还原):
import pandas as pd s = {'BoP transfers': {1998: 12.346282212735618, 1999: 19.06438060024298, 2000: 18.24888031473687, 2001: 24.860019912667006, 2002: 32.38242225822908}, 'Current balance': {1998: -6.7953, 1999: -2.9895, 2000: -3.9694, 2001: 1.1716, 2002: 5.7433}, 'Domestic demand': {1998: 106.8610389799729, 1999: 104.70302507466538, 2000: 104.59254229534136, 2001: 103.83532232336977, 2002: 102.81709401489702}, 'Effective exchange rate': {1998: 88.134, 1999: 95.6425, 2000: 99.927725, 2001: 101.92745, 2002: 107.85565}, 'RoR (foreign liabilities)': {1998: 0.0433, 1999: 0.0437, 2000: 0.0542, 2001: 0.0539, 2002: 0.0474}, 'Gross foreign assets': {1998: 19.720897432405103, 1999: 22.66200738564236, 2000: 25.18270679890144, 2001: 30.394226651732836, 2002: 37.26477320359688}, 'Gross domestic income': {1998: 104.9037939043707, 1999: 103.15361867816479, 2000: 103.06777792080423, 2001: 102.85886528974339, 2002: 102.28518242008846}, 'Gross foreign liabilities': {1998: 60.59784839338306, 1999: 61.03308220978983, 2000: 64.01438055825233, 2001: 67.07798172469921, 2002: 70.16108592109364}, 'Inflation rate': {1998: 52.6613, 1999: 19.3349, 2000: 16.0798, 2001: 15.076, 2002: 17.236}, 'Credit': {1998: 0.20269913592846378, 1999: 0.2154280880177353, 2000: 0.282948948505006, 2001: 0.3954812893893278, 2002: 0.3578263032373988}} df = pd.DataFrame.from_dict(s)
需求是按每3列拆分DataFrame,原本尝试动态命名df_1、df_2等变量,但代码无法运行:
dim = df.shape[1] counter1 = 0 counter2 = 1 while(counter1 <= dim): df_str(counter2) = df.iloc[:, counter1: (counter1 + 3)] counter1 = counter1 + 3 counter2 = counter2 + 1
已知动态命名变量不规范,需用字典实现,求具体方法。
解决方案:用字典存储拆分后的DataFrame
用字典保存拆分后的子DataFrame是更规范、易维护的做法,具体代码如下:
import pandas as pd # 还原原始DataFrame s = {'BoP transfers': {1998: 12.346282212735618, 1999: 19.06438060024298, 2000: 18.24888031473687, 2001: 24.860019912667006, 2002: 32.38242225822908}, 'Current balance': {1998: -6.7953, 1999: -2.9895, 2000: -3.9694, 2001: 1.1716, 2002: 5.7433}, 'Domestic demand': {1998: 106.8610389799729, 1999: 104.70302507466538, 2000: 104.59254229534136, 2001: 103.83532232336977, 2002: 102.81709401489702}, 'Effective exchange rate': {1998: 88.134, 1999: 95.6425, 2000: 99.927725, 2001: 101.92745, 2002: 107.85565}, 'RoR (foreign liabilities)': {1998: 0.0433, 1999: 0.0437, 2000: 0.0542, 2001: 0.0539, 2002: 0.0474}, 'Gross foreign assets': {1998: 19.720897432405103, 1999: 22.66200738564236, 2000: 25.18270679890144, 2001: 30.394226651732836, 2002: 37.26477320359688}, 'Gross domestic income': {1998: 104.9037939043707, 1999: 103.15361867816479, 2000: 103.06777792080423, 2001: 102.85886528974339, 2002: 102.28518242008846}, 'Gross foreign liabilities': {1998: 60.59784839338306, 1999: 61.03308220978983, 2000: 64.01438055825233, 2001: 67.07798172469921, 2002: 70.16108592109364}, 'Inflation rate': {1998: 52.6613, 1999: 19.3349, 2000: 16.0798, 2001: 15.076, 2002: 17.236}, 'Credit': {1998: 0.20269913592846378, 1999: 0.2154280880177353, 2000: 0.282948948505006, 2001: 0.3954812893893278, 2002: 0.3578263032373988}} df = pd.DataFrame.from_dict(s) # 初始化空字典存储拆分结果 df_dict = {} # 设定每3列为一组 chunk_size = 3 total_cols = df.shape[1] # 循环拆分并存储 for i in range(0, total_cols, chunk_size): group_num = (i // chunk_size) + 1 df_dict[f'df_{group_num}'] = df.iloc[:, i:i+chunk_size] # 示例:访问第一组子DataFrame print(df_dict['df_1']) # 示例:访问第二组子DataFrame print(df_dict['df_2'])
代码说明
- 用空字典
df_dict统一管理所有拆分后的子DataFrame,避免动态变量的混乱 range(0, total_cols, chunk_size)生成每次截取的起始列索引,步长为3,确保按组拆分- 组号通过
(i // chunk_size) + 1计算,保证从1开始编号,符合你原本的命名习惯 - 通过
df.iloc[:, i:i+chunk_size]截取对应列的子DataFrame,并存入字典
这种方法的优势:
- 便于批量处理所有子DataFrame(比如循环遍历字典做统一操作)
- 可以通过键名快速定位到目标子DataFrame
- 代码结构清晰,后期维护成本低
内容的提问来源于stack exchange,提问作者Carl
相关产品推荐
相关产品推荐

