pandas dataframe view vs copy, как мне сказать?

В чем разница между:

pandas df.loc[:,('col_a','col_b')]

а также

df.loc[:,['col_a','col_b']]

В приведенной ниже ссылке не упоминается последняя, ​​хотя она работает. Сделайте оба взгляда? Первый вытягивает вид, а второй вытаскивает копию? Любовь, изучающая Панды.

http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

благодаря

  • Установка двоичных модулей Python в пользовательское местоположение в Windows
  • Объект не поддерживает ошибку присваивания элемента
  • Python разделяет запятую на int
  • Получение SQL из Django QuerySet
  • Детские процессы, созданные с помощью модуля многопроцессорности python, не будут печатать
  • Каковы все возможные позиционные метки NLTK?
  • OS X - решение между средами anaconda и homebrew Python
  • Неожиданно задан оператор python `with`
  • One Solution collect form web for “pandas dataframe view vs copy, как мне сказать?”

    Если ваш DataFrame имеет простой индекс столбца, то нет никакой разницы. Например,

     In [8]: df = pd.DataFrame(np.arange(12).reshape(4,3), columns=list('ABC')) In [9]: df.loc[:, ['A','B']] Out[9]: AB 0 0 1 1 3 4 2 6 7 3 9 10 In [10]: df.loc[:, ('A','B')] Out[10]: AB 0 0 1 1 3 4 2 6 7 3 9 10 

    Но если DataFrame имеет MultiIndex, может быть большая разница:

     df = pd.DataFrame(np.random.randint(10, size=(5,4)), columns=pd.MultiIndex.from_arrays([['foo']*2+['bar']*2, list('ABAB')]), index=pd.MultiIndex.from_arrays([['baz']*2+['qux']*3, list('CDCDC')])) # foo bar # ABAB # baz C 7 9 9 9 # D 7 5 5 4 # qux C 5 0 5 1 # D 1 7 7 4 # C 6 4 3 5 In [27]: df.loc[:, ('foo','B')] Out[27]: baz C 9 D 5 qux C 0 D 7 C 4 Name: (foo, B), dtype: int64 In [28]: df.loc[:, ['foo','B']] KeyError: 'MultiIndex Slicing requires the index to be fully lexsorted tuple len (1), lexsort depth (0)' 

    KeyError говорит, что MultiIndex должен быть lexsorted. Если мы это сделаем, мы получим другой результат:

     In [29]: df.sortlevel(axis=1).loc[:, ('foo','B')] Out[29]: baz C 9 D 5 qux C 0 D 7 C 4 Name: (foo, B), dtype: int64 In [30]: df.sortlevel(axis=1).loc[:, ['foo','B']] Out[30]: foo AB baz C 7 9 D 7 5 qux C 5 0 D 1 7 C 6 4 

    Почему это? df.sortlevel(axis=1).loc[:, ('foo','B')] выбирает столбец, где первый уровень столбца равен foo , а второй уровень столбца – B

    Напротив, df.sortlevel(axis=1).loc[:, ['foo','B']] выбирает столбцы, где первый уровень столбца является либо foo либо B Что касается первого уровня столбца, то нет столбцов B , но есть два столбца foo .

    Я думаю, что принцип работы с Pandas заключается в том, что если вы используете df.loc[...] в качестве выражения , вы должны предположить, что df.loc может возвращать копию или представление. В документах Pandas не указаны какие-либо правила, о которых вы должны ожидать. Однако, если вы выполняете задание формы

     df.loc[...] = value 

    то вы можете доверять Pandas, чтобы изменить сам df .

    Причина, по которой документация предупреждает о различии между представлениями и копиями, заключается в том, что вы знаете о том, как использовать цепочку присвоений формы

     df.loc[...][...] = value 

    Здесь Pandas df.loc[...] оценивает df.loc[...] , что может быть просмотром или копией. Теперь, если это копия, тогда

     df.loc[...][...] = value 

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


    Я не знаю практического df.loc[...] априорного способа определить, будет ли df.loc[...] возвращать представление или копию.

    Тем не менее, есть некоторые эмпирические правила, которые могут помочь в вашей интуиции (но обратите внимание, что мы говорим о деталях реализации здесь, поэтому нет никакой гарантии, что Pandas должен вести себя таким образом в будущем):

    • Если результат NDFrame не может быть выражен как основной срез базового массива NumPy, то он, вероятно, будет копией. Таким образом, выбор произвольных строк или столбцов приведет к копированию. Выбор последовательных строк и / или последовательных столбцов (которые могут быть выражены как срез) может возвращать представление.
    • Если в результате NDFrame имеет столбцы разных типов, то df.loc снова, вероятно, вернет копию.

    Тем не менее, есть простой способ определить, является ли x = df.loc[..] вид postiori : просто посмотрите, меняется ли значение x df . Если это так, это представление, если нет, x – это копия.

    Interesting Posts

    Строка в списке, в функцию

    В Python, как я могу получить доступ к «статическим» переменным класса в методах класса

    Ошибка matplotlib – нет модуля с именем tkinter

    python, проблемы с вызовами функций из модуля

    Python – лучший способ прочитать файл и разбить линии по делителю

    Импорт Python для тестирования с использованием носа – что лучше всего подходит для импорта модулей выше текущего пакета

    python: TypeError: не удается записать str в текстовый поток

    Импортировать файл, используя строку как имя

    Изменить значение в словаре

    Самый быстрый способ создания векторных функций векторов Python

    Самый быстрый способ сгенерировать строку с разделителем из массива 1d numpy

    Я не могу установить numpy, потому что он не может найти python 2.7, хотя я установил python

    Сравнение нескольких переменных с одним и тем же значением в «if» в Python?

    Запись в Python несовместима между 2.5 и 2.6

    Python: динамический импорт «из»

    Python - лучший язык программирования в мире.