0

当我单独对每个 df 进行编码时,我不得不融化 4 个数据文件,然后重命名值列,但在进行 for 循环时,代码不起作用?为什么?

for 循环:

data_files = [df1, df2, df3, df4]
names = ['child_mortality','income','life_expectancy','population']
i = 0

for df in data_files: 
    df = df.melt(['country'], var_name='year')
    df = df.rename(columns = {'value': names[i]}, inplace = False)
    i += 1 
df1

没有变化

在此处输入图像描述

4

2 回答 2

0

问题

这是因为您正在更改 DataFrame 的副本。

例子:

a, b, c, d = 1, 2, 3, 4
data_files = [a, b, c, d]
print(data_files)
# > [1, 2, 3, 4]

有副本:

for x in data_files:
    x = 0
print(data_files)
# > [1, 2, 3, 4]  # No change

通过索引列表:

for i in range(len(data_files)):
    data_files[i] = 0
print(data_files)
# > [0, 0, 0, 0]  # Change

解决方案

解决方案 1:索引列表

for i in range(len(data_files)): 
    data_files[i] = data_files[i].melt(['country'], var_name='year')
    data_files[i] = data_files[i].rename(columns = {'value': names[i]}, inplace = False)

解决方案 2:覆盖列表中的元素

for i, df in enumerate(data_files): 
    df = df.melt(['country'], var_name='year')
    df = df.rename(columns = {'value': names[i]}, inplace = False)
    # Updating the list
    data_files[i] = df

解决方案 3:覆盖整个列表(或拥有一个新列表)

new_dfs = []
for df in data_files: 
    df = df.melt(['country'], var_name='year')
    df = df.rename(columns = {'value': names[i]}, inplace = False)
    new_dfs.append(df)
# If needed:
data_files = new_dfs
于 2021-06-08T07:22:19.000 回答
0

您正在为每次迭代创建一个新对象,如果您不将其分配回去,则数据框列表保持不变:

df1,df2,df3,df4 = [pd.DataFrame({'country':['a','b','c'],
'v1':np.random.randint(0,10,3),
'v2':np.random.randint(0,10,3)}) for i in range(4)]

data_files = [df1, df2, df3, df4]

i = 0 
names = ['child_mortality','income','life_expectancy','population']
for df in data_files: 
    df = df.melt(['country'], var_name='year')
    df = df.rename(columns = {'value': names[i]}, inplace = False)
    data_files[i] = df
    i += 1

现在列表中的数据框已更改,但不是您的原始数据框:

data_files[0]

  country year  income
0       a   v1       0
1       b   v1       7
2       c   v1       9
3       a   v2       8
4       b   v2       0
5       c   v2       0

如果你想改变你的 df1,df2 等,它将是:

df1, df2, df3, df4 = data_files
于 2021-06-08T07:27:42.143 回答