for循环创建dataframe导致数据全部和最后一个dataframe数据相同的问题


name1 = data1.columns.tolist()
arr = np.zeros((35*34,3))
for i in tqdm(range (0,34,2)):          
    globals()['list'+ '0' + str(int(i/2+1))] =[]
    for j in range (36):
        if j == i:
            continue
        for k in range (36):
            if k == i or k==j:
                continue
            else:
                    globals()['list'+ '0' + str(int(i/2+1))].append(name1[i] + "→" + name1[j] + "→"  +  name1[k] + "→劳动")
    globals()['df'+ '0' + str(int(i/2+1))] = pd.DataFrame(arr,columns = ["直接影响","路径乘数","完全影响"],index = globals()['list'+ '0' + str(int(i/2+1))])
for i in tqdm(range(0,34,2)):
    globals()['list'+ '直接影响0' + str(int(i/2+1))] =[]    
    for j in range(36):
        if j==i:
            continue
        for k in range(36):
            if k==i or k==j:
                continue
            else:
                globals()['list'+ '直接影响0' + str(int(i/2+1))].append(data1.iloc[j,i]*data1.iloc[k,j]*data1.iloc[36,k])  

for i in tqdm(range(0,34,2)):
    for n in range(1190):
        globals()['df'+ '0' + str(int(i/2+1))].iloc[n,0] = globals()['list'+ '直接影响0' + str(int(i/2+1))][n]

这里我想循环创建dataframe,并将list中的数据赋值到里面,但是最终结果发现每个df的结果都是最后一个df计算出来的结果,有解决方法吗?

img

img

问问大佬们,会不会是arr赋值的问题,需要每个都对应不同的arr

很明显肯定是变量被污染了,检查一下你使用globals()的地方

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7639807
  • 这篇博客也不错, 你可以看下Pandas-数据结构-DataFrame(二):设置索引【①创建DataFrame时添加行、列索引;②修改行/列索引值;③重设新下标索引;④以某列值设置为新的索引】
  • 除此之外, 这篇博客: 创建一个带列名的无数据的Dataframe并为其追加数据中的 创建Dataframe 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 直接参数指定新的Dataframe的列名

    data = pd.Dataframe(columns=cols)
    
  • 以下回答由chatgpt基于相关博客总结生成:

    问题解答:

    问题原因是在循环创建多个dataframe的过程中,每次创建的dataframe都是新的对象,但是最后一次循环结束后,每个dataframe都指向了同一个对象。因此,当对其中一个dataframe进行赋值操作时,其他dataframe也会跟着改变。

    要解决这个问题,可以在每次循环中创建一个新的dataframe对象,并将数据赋值给它。然后将每个dataframe添加到一个列表中,最后再对列表中的dataframe进行操作。

    以下是具体的解决方案:

    1. 首先创建一个空的列表来存储dataframe对象:
    dataframes = []
    
    1. 在循环中创建每个dataframe对象,并将数据赋值给它:
    for i in range(10):  # 循环创建10个dataframe
        # 创建一个新的dataframe对象
        df = pd.DataFrame(columns=['col1', 'col2'])
    
        # 将数据赋值给dataframe
        df['col1'] = [1, 2, 3, 4, 5]
        df['col2'] = [6, 7, 8, 9, 10]
    
        # 将dataframe添加到列表中
        dataframes.append(df)
    
    1. 现在你可以对列表中的每个dataframe进行操作了,例如获取某个dataframe的数据:
    dataframes[0].head()  # 获取第一个dataframe的前几行数据
    
    1. 如果你想将所有的dataframe合并成一个大的dataframe,可以使用pd.concat()函数:
    merged_df = pd.concat(dataframes, ignore_index=True)  # 忽略原始的索引
    

    以上是解决该问题的具体步骤,你可以根据你的实际需求进行调整和修改。