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计算出来的结果,有解决方法吗?
问问大佬们,会不会是arr赋值的问题,需要每个都对应不同的arr
很明显肯定是变量被污染了,检查一下你使用globals()的地方
直接参数指定新的Dataframe的列名
data = pd.Dataframe(columns=cols)
问题解答:
问题原因是在循环创建多个dataframe的过程中,每次创建的dataframe都是新的对象,但是最后一次循环结束后,每个dataframe都指向了同一个对象。因此,当对其中一个dataframe进行赋值操作时,其他dataframe也会跟着改变。
要解决这个问题,可以在每次循环中创建一个新的dataframe对象,并将数据赋值给它。然后将每个dataframe添加到一个列表中,最后再对列表中的dataframe进行操作。
以下是具体的解决方案:
dataframes = []
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)
dataframes[0].head() # 获取第一个dataframe的前几行数据
pd.concat()
函数:merged_df = pd.concat(dataframes, ignore_index=True) # 忽略原始的索引
以上是解决该问题的具体步骤,你可以根据你的实际需求进行调整和修改。