Проверка того, является ли фрейм данных копией или представлением в Pandas
есть ли простой способ проверить, являются ли два фрейма данных разными копиями или представлениями одних и тех же базовых данных, которые не связаны с манипуляциями? Я пытаюсь понять, когда каждый из них генерируется, и учитывая, насколько своеобразными кажутся правила, я хотел бы простой способ проверить.
например, я подумал " id(df.значения) " были бы стабильны в разных представлениях, но они, похоже, не являются:
# Make two data frames that are views of same data.
df = pd.DataFrame([[1,2,3,4],[5,6,7,8]], index = ['row1','row2'],
columns = ['a','b','c','d'])
df2 = df.iloc[0:2,:]
# Demonstrate they are views:
df.iloc[0,0] = 99
df2.iloc[0,0]
Out[70]: 99
# Now try and compare the id on values attribute
# Different despite being views!
id(df.values)
Out[71]: 4753564496
id(df2.values)
Out[72]: 4753603728
# And we can of course compare df and df2
df is df2
Out[73]: False
другие ответы, которые я искал, которые пытаются дать правила, но не кажутся последовательными, а также не отвечают на этот вопрос о том, как проверить:
и конечно: - http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy
обновление: комментарии ниже, похоже, отвечают на вопрос-глядя на это, как и ссылка на df._is_copy
атрибут (хотя последний, вероятно, очень плохая форма, так как это внутренний).
2 ответов
ответы от HYRY и Marius в комментариях!
можно проверить следующим образом:
-
проверка эквивалентности , а не (
df2._is_view
isTrue
).
спасибо всем!
вы можете отслеживать память, которую потребляет ваша среда pandas/python, и, исходя из предположения, что копия будет использовать больше памяти, чем представление, сможете решить так или иначе.
Я считаю, что есть библиотеки, которые будут представлять использование памяти в самой среде python-например, Heapy / Guppy.
должна быть метрика, которую вы можете применить, которая принимает базовое изображение использования памяти до создания объекта проверки, а затем потом еще одна фотография. Сравнение двух карт памяти (предполагая, что больше ничего не было создано, и мы можем изолировать изменение из-за нового объекта) должно дать представление о том, было ли создано представление или копия.
нам нужно получить представление о разных профилях памяти каждого типа реализации, но некоторые эксперименты должны давать результаты.