действительно хорошая функциональность, я не знал об этом. Спасибо

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

df = pd.DataFrame([{'name':'Marry', 'age':21},{'name':'John','age':24}],index=['student1','student2'])

df
              age   name
   student1   21  Marry
   student2   24   John

Теперь позвольте мне немного его изменить.

df2= df.loc['student1']
df2 [0] = 23
df
              age   name
   student1   21  Marry
   student2   24   John

Как видите, ничего не изменилось. df2 это копия. Тем не менее, если я добавлю еще одного студента в кадр данных ...

df.loc['student3'] = ['old','Tom']
df
               age   name
    student1   21  Marry
    student2   24   John
    student3  old    Tom

Попробуйте снова изменить возраст ..

df3=df.loc['student1']
df3[0]=33
df
               age   name
    student1   33  Marry
    student2   24   John
    student3  old    Tom

Теперь df3 внезапно стал представлением. Что происходит? Я думаю, значение «старый» является ключом?

Ответы на вопрос(2)

который имеет два столбца с двумя разными dtypes:

df.dtypes
Out: 
age      int64
name    object
dtype: object

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

df.blocks

Out: 
{'int64':           age
 student1   21
 student2   24, 'object':            name
 student1  Marry
 student2   John}

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

df2.is_copy
Out[40]: <weakref at 0x7fc4487a9228; to 'DataFrame' at 0x7fc4488f9dd8>

Во второй попытке вы меняете dtypes. Поскольку «старый» не может быть сохранен в целочисленном массиве, он преобразует Серию как Серию объектов.

df.loc['student3'] = ['old','Tom']

df.dtypes
Out: 
age     object
name    object
dtype: object

Теперь все данные для этого DataFrame хранятся в одном блоке (и в едином массиве):

df.blocks

Out: 
{'object':           age   name
 student1   21  Marry
 student2   24   John
 student3  old    Tom}

На этом этапе нарезка первой строки может быть выполнена для массива numpy без создания копии, поэтому он возвращает представление.

df3._is_view
Out: True
 Puneet Tripathi26 дек. 2017 г., 08:07
_is_view действительно хорошая функциональность, я не знал об этом. Спасибо
 juanpa.arrivillaga26 дек. 2017 г., 00:38
Никогда не знал оdf.blocks
Решение Вопроса

вы можете получить представление, если фрейм данных имеет одинdtype, которыйне случай с вашим исходным фреймом данных:

In [4]: df
Out[4]:
          age   name
student1   21  Marry
student2   24   John

In [5]: df.dtypes
Out[5]:
age      int64
name    object
dtype: object

Тем не менее, когда вы делаете:

In [6]: df.loc['student3'] = ['old','Tom']
   ...:

Первый столбец get приведен кobject, поскольку столбцы не могут иметь смешанные типы:

In [7]: df.dtypes
Out[7]:
age     object
name    object
dtype: object

В этом случае основной.values всегда будет возвращать массив с тем же базовым буфером, и изменения в этом массиве будут отражены во фрейме данных:

In [11]: vals = df.values

In [12]: vals
Out[12]:
array([[21, 'Marry'],
       [24, 'John'],
       ['old', 'Tom']], dtype=object)

In [13]: vals[0,0] = 'foo'

In [14]: vals
Out[14]:
array([['foo', 'Marry'],
       [24, 'John'],
       ['old', 'Tom']], dtype=object)

In [15]: df
Out[15]:
          age   name
student1  foo  Marry
student2   24   John
student3  old    Tom

С другой стороны, со смешанными типами, как с исходным фреймом данных:

In [26]: df = pd.DataFrame([{'name':'Marry', 'age':21},{'name':'John','age':24}]
    ...: ,index=['student1','student2'])
    ...:

In [27]: vals = df.values

In [28]: vals
Out[28]:
array([[21, 'Marry'],
       [24, 'John']], dtype=object)

In [29]: vals[0,0] = 'foo'

In [30]: vals
Out[30]:
array([['foo', 'Marry'],
       [24, 'John']], dtype=object)

In [31]: df
Out[31]:
          age   name
student1   21  Marry
student2   24   John

Тем не менее, обратите внимание, что представление будет возвращено только в том случае, если оно может быть представлением, то есть, если это правильный фрагмент, в противном случае копия будет сделана независимо от типов dtypes:

In [39]: df.loc['student3'] = ['old','Tom']


In [40]: df2
Out[40]:
          name
student3   Tom
student2  John

In [41]: df2.loc[:] = 'foo'

In [42]: df2
Out[42]:
         name
student3  foo
student2  foo

In [43]: df
Out[43]:
          age   name
student1   21  Marry
student2   24   John
student3  old    Tom
 juanpa.arrivillaga26 дек. 2017 г., 04:12
@Qiyu с несколькими dtypes да.
 Qiyu26 дек. 2017 г., 17:27
Понял. Спасибо!
 Qiyu26 дек. 2017 г., 02:28
Значит ли это, что я всегда получу копию, если фрейм данных имеет несколько dtypes?

Ваш ответ на вопрос