Переиндексировать кадр данных внутри цикла

Я пытаюсь переиндексировать столбцы в наборе фреймов данных внутри цикла. Кажется, это работает только вне цикла. См. пример кода ниже

import pandas as pd

data1 = [[1,2,3],[4,5,6],[7,8,9]]
data2 = [[10,11,12],[13,14,15],[16,17,18]]
data3 = [[19,20,21],[22,23,24],[25,26,27]]
index = ['a','b','c']
columns = ['d','e','f']

df1 = pd.DataFrame(data=data1,index=index,columns=columns)
df2 = pd.DataFrame(data=data2,index=index,columns=columns)
df3 = pd.DataFrame(data=data3,index=index,columns=columns)

columns2 = ['f','e','d']

for i in [df1,df2,df3]:
    i = i.reindex(columns=columns2)

print(df1)

df2 = df2.reindex(columns=columns2)

print(df2)

df1 не переиндексируется, как хотелось бы, однако, если я переиндексирую df2 вне цикла, он работает. Почему это?

Спасибо, Эндрю.


person Andrew5715    schedule 30.04.2021    source источник


Ответы (1)


Это происходит по той же причине, что и это:

a = 5
b = 6
for i in [a, b]:
    i = 4

>>> a
    5

Почему? См. этот принятый ответ .

Что касается вашей проблемы, один из способов ее решения - создать list переиндексированных фреймов данных, например:

reindexed_dfs = [df.reindex(columns=columns2) for df in [df1, df2, df3]]

а затем переназначить df1, df2 и df3. Но в любом случае лучше просто продолжать использовать только что созданный список.

person Camilo Martinez M.    schedule 30.04.2021
comment
Большое спасибо @Camilo Martinez. Это сработало, и это отличный фон о том, как лучше всего работать с переменными. - person Andrew5715; 30.04.2021