Что является хорошим способом предотвратить применение изменений к исходному фрейму данных? - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь передать фрейм данных с помощью некоторых команд (подготавливаю ряд аргументов для функции).Однако, когда я назначаю фрейм данных другому фрейму данных, это назначение, кажется, работает как эквивалентность.Другими словами, после присвоения фрейма данных новому, все изменения применяются и к исходному.Что является хорошим способом сохранить исходный фрейм данных в его исходном состоянии, чтобы его можно было переназначить другим командам для других изменений.

См. Пример ниже.

# Merge several dataframes

df1 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'eTIV': [1.12, 2.22, 3.43, 5.43], })
df2 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Ear_Vol': [5, 6, 7, 8]})
df3 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Nose': [1, 2, 3, 5], })
df4 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Eye_Vol': [1, 2, 3, 5], })
df5 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Finger': [1.3, 2.123, 3.4, 5.5], })

dfs = [df1, df2, df3, df4,df5]

df_final = reduce(lambda left,right: pd.merge(left,right,on='ID'), dfs)

df_final

 ID eTIV    Ear_Vol Nose    Eye_Vol Finger
0   Mary    1.12    5   1   1   1.300
1   Mike    2.22    6   2   2   2.123
2   Barry   3.43    7   3   3   3.400
3   Scotty  5.43    8   5   5   5.500

Присвоение фрейма данных другому фрейму данных и манипуляции:

df = df_final
df_raw = df
df_raw.columns = df_raw.columns.str.replace(r"_Vol", "_Vol_Raw")
df_raw = pd.DataFrame(data = df_raw, columns= df_raw.columns)

Новый фрейм данных (как и ожидалось):

df_raw
ID  eTIV    Ear_Vol_Raw Nose    Eye_Vol_Raw Finger
0   Mary    1.12    5   1   1   1.300
1   Mike    2.22    6   2   2   2.123
2   Barry   3.43    7   3   3   3.400
3   Scotty  5.43    8   5   5   5.500

По какой-то причине исходный фрейм данныхтакже изменяется (почему назначение изменяет оригинал здесь?):

df

    ID  eTIV    Ear_Vol_Raw Nose    Eye_Vol_Raw Finger
0   Mary    1.12    5   1   1   1.300
1   Mike    2.22    6   2   2   2.123
2   Barry   3.43    7   3   3   3.400
3   Scotty  5.43    8   5   5   5.500

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Если вы хотите скопировать и переименовать столбцы, вы можете использовать переименовать , чтобы сделать это за один шаг, по умолчанию метод копирует базовые данные:

df_raw = df.rename(axis='columns', mapper=lambda s: s.replace(r"_Vol", "_Vol_Raw"))

print(df)
print(df_raw)

Выход

       ID  eTIV  Ear_Vol  Nose  Eye_Vol  Finger
0    Mary  1.12        5     1        1   1.300
1    Mike  2.22        6     2        2   2.123
2   Barry  3.43        7     3        3   3.400
3  Scotty  5.43        8     5        5   5.500
       ID  eTIV  Ear_Vol_Raw  Nose  Eye_Vol_Raw  Finger
0    Mary  1.12            5     1            1   1.300
1    Mike  2.22            6     2            2   2.123
2   Barry  3.43            7     3            3   3.400
3  Scotty  5.43            8     5            5   5.500
0 голосов
/ 14 февраля 2019

Если вы хотите скопировать фрейм данных и создать новый объект, используйте .copy.

# Merge several dataframes
import pandas as pd
from functools import reduce
df1 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'eTIV': [1.12, 2.22, 3.43, 5.43], })
df2 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Ear_Vol': [5, 6, 7, 8]})
df3 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Nose': [1, 2, 3, 5], })
df4 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Eye_Vol': [1, 2, 3, 5], })
df5 = pd.DataFrame({'ID': ['Mary', 'Mike', 'Barry', 'Scotty'],'Finger': [1.3, 2.123, 3.4, 5.5], })

dfs = [df1, df2, df3, df4,df5]

df_final = reduce(lambda left,right: pd.merge(left,right,on='ID'), dfs)

df_final
df = df_final

print(df is df_final) #Prints True. They are both the same dataframe.

df_raw = df.copy() #Modified

print (df is df_raw) #Prints False. the copy method created a copy of the underlying dataframe object.
df_raw.columns = df_raw.columns.str.replace(r"_Vol", "_Vol_Raw")
df_raw = pd.DataFrame(data = df_raw, columns= df_raw.columns)
print(df_raw)
print(df) #No longer affected by df_raw

Причина, по которой простое назначение показывает исходное поведение, заключается в том, что имена относятсязначениям в питоне.присваивание только дает 2 метки, которые указывают на один и тот же базовый объект dataframe.Таким образом, когда объект изменяется, все имена, связанные с объектом, отражают изменения.Хорошо читать дальше здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...