Python,循环文件名的可变部分

Python,循环文件名的可变部分,python,dataframe,Python,Dataframe,我有一组非常类似的命令,它们都是这样的(df表示数据帧): 我想为它做一个循环,如下所示: for i in range(1,5): for j in range(1,5): df%i_part%j=... 当然,它对%不起作用。但我想这必须是一种简单的方法。 您能帮我吗?您可以尝试以下选项之一: 创建映射df的字典,并通过数据帧的名称访问它: 使用globals动态访问变量: 一种方法是在列表列表中收集数据帧并在该列表上迭代,而不是尝试动态解析python代码 df1_part1=... d

我有一组非常类似的命令,它们都是这样的(df表示数据帧):

我想为它做一个循环,如下所示:

for i in range(1,5):
for j in range(1,5):
df%i_part%j=...
当然,它对%不起作用。但我想这必须是一种简单的方法。
您能帮我吗?

您可以尝试以下选项之一:

  • 创建映射df的字典,并通过数据帧的名称访问它:
  • 使用
    globals
    动态访问变量:

  • 一种方法是在列表列表中收集数据帧并在该列表上迭代,而不是尝试动态解析python代码

    df1_part1=...
    df1_part2=...
    ...
    df1_part5=...
    df2_part1=...
    
    dflist = [[df1_part1, df1_part2, df1_part3, df1_part4, df1_part5],
              [df2_part1, df2_part2, df2_part3, df2_part4, df2_part5]]
    for df in dflist:
        for df_part in df:
            # do something with df_part
    

    假设这个过程是数据准备的一部分,我想提一下,只要可能,您应该尝试使用“数据准备管道”。否则,代码在几个月后就会变得一团糟

    有几种方法可以解决这个问题

    字典是处理这个问题最直接的方法

    df_零件={
    'df1':{'part1':df1_part1,'part2':df1_part2,…,'partN':df1_partN},
    'df2':{'part1':df1_part1,'part2':df1_part2,…,'partN':df2_partN},
    “…”:{'part1':…\part1,'part2':…\part2,'partN':…\partN},
    ‘dfN’:{'part1':dfN_part1,'part2':dfN_part2,…,'partN':dfN_partN},
    }
    #从“dfN”打印零件`
    对于df_零件['dfN']的val in。值()
    打印(val)
    #打印所有dfs的第1部分
    对于df_parts.values()中的df:
    打印(df['part1'])
    #打印所有内容
    对于df_零件中的df:
    对于df_零件[df]中的val,值()
    打印(val)
    
    这种方法的好处是,您可以遍历整个字典,但不包括
    range
    ,以后可能会混淆。此外,最好将每个DFU部件直接分配给dict,而不是分配可能使用一次或两次的
    N*N
    变量。在这种情况下,您只需使用1个变量,并在进行过程中重新分配:

    #使用df1编码
    df1=df_零件['df1']['partN']
    #要做的事
    #高兴吗?检查站
    df_零件['df1']['partN']=df1
    
    将数据帧分配给dict,而不是分配给变量。避免在不必要时使用全局变量,在我的情况下,全局变量的替代方案是什么?我无法定义文件列表,它太长了。我不仅有左边有数字的文件,右边还有更多。我仍然觉得奇怪的是,没有简单的解决方案。在SAS中,只需编写df%i_部分%j=。。。一切都很好。宏变量使之成为可能。有一个简单的解决方案:使用适当的数据结构,如字典,而不是使用
    globals
    挖掘变量名的内部。我有一些命令,如verb_kd_top3_z=top3[top3.kd.isin(top3_zl_kd)==True]我不想手动创建所有文件的列表或字典。这个解决方案没有多大帮助。实际上,我在每个命令中都有许多地方,其中相同的数字是某个文件的一部分。列表列表会很长。需要编写很多代码,所以最后我不会节省任何时间。问题是,我有5种不同类型的文件名,其中包含数字,而不仅仅是df。。。所以我需要5本字典,然后我必须重写所有命令。简单地复制、粘贴和手动更改数字更容易。我可以更快地做到这一点。我同意问题在于“糟糕”的数据准备,但我不想这样做。但我还是要用它,我无权更改名称约定。
    mapping = {"df1_part1": df1_part1, "df1_part2": df1_part2}
    for i in range(1,5):
        for j in range(1,5):
            mapping[f"df{i}_part{j}"] = ...
    
    df1_part1=...
    df1_part2=...
    ...
    df1_part5=...
    df2_part1=...
    
    for i in range(1,5):
        for j in range(1,5):
            globals()[f"df{i}_part{j}"] = ...
    
    df1_part1=...
    df1_part2=...
    ...
    df1_part5=...
    df2_part1=...
    
    dflist = [[df1_part1, df1_part2, df1_part3, df1_part4, df1_part5],
              [df2_part1, df2_part2, df2_part3, df2_part4, df2_part5]]
    for df in dflist:
        for df_part in df:
            # do something with df_part