Подтвердить что ты не робот

Проверка того, является ли кадр данных копией или просмотром в Pandas

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

Например, я думал, что "id (df.values)" будет устойчивым по представлениям, но они, похоже, не являются:

# 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.values.base вместо атрибута df.values делает, как и ссылку на атрибут df._is_copy (хотя последнее, вероятно, очень плохое, поскольку оно является внутренним).

4b9b3361

Ответ 1

Ответы от HYRY и Marius в комментариях!

Можно проверить либо:

  • проверка эквивалентности атрибута values.base, а не атрибута values, как в:

    df.values.base is df2.values.base вместо df.values is df2.values.

  • или используя (по общему признанию, внутренний) атрибут _is_view (df2._is_view is True).

Спасибо всем!

Ответ 2

Вы можете отслеживать память, в которой потребляет ваша среда pandas/python, и, исходя из предположения, что копия будет использовать больше памяти, чем представление, сможет решить так или иначе.

Я считаю, что есть библиотеки, которые будут представлять использование памяти в самой среде python - например, Бесформенный/Гуппи.

Должна быть метрика, которую вы можете применить, которая берет базовое изображение использования памяти до создания объекта, находящегося под контролем, затем другого изображения. Сравнение двух карт памяти (при условии, что ничего не было создано, и мы можем выделить это изменение из-за нового объекта) должно обеспечить представление о том, было ли создано представление или копия.

Нам нужно получить представление о различных профилях памяти для каждого типа реализации, но некоторые эксперименты должны давать результаты.