Будет ли нарезка DataFrame в python возвращать копию или ссылку на исходный DataFrame - PullRequest
1 голос
/ 16 июня 2020
import numpy as np
import pandas as pd
from numpy.random import randn
np.random.seed(101)

print(randn(5, 4))
df = pd.DataFrame( randn(5, 4), ['A', 'B', 'C', 'D', 'F'], ['W', 'X', 'Y', 'Z'] )

tmp_df = df['X'] 
print(type(tmp_df)) # Here type is Series (as expected)

tmp_df.loc[:] = 12.3
print(tmp_df)

print(df)

Этот код изменяет содержимое (исходного) DataFrame df.

np.random.seed(101)
print(randn(5, 4))
df = pd.DataFrame( randn(5, 4), ['A', 'B', 'C', 'D', 'F'], ['W', 'X', 'Y', 'Z'] )

tmp_df = df.loc[['A', 'B'], ['W', 'X']] 
print(type(tmp_df)) # Type is DataFrame

tmp_df.loc[:] = 12.3 # whereas, here when I change the content of the tmp_df it doesn't reflect on original array.
print(tmp_df)

print(df)

Значит ли это, что если мы вырезаем серию из DataFrame, ссылка передается на разрезанный объект. Принимая во внимание, что если это DataFrame, который был нарезан, то он не указывает на исходный DataFrame.

Пожалуйста, подтвердите, верен ли мой вывод выше или нет? Помощь будет признательна.

1 Ответ

0 голосов
/ 16 июня 2020

Проще говоря: Индексирование списками в loc всегда возвращает копию .

Давайте работать с DataFrame df:

df=pd.DataFrame({'A':[i for i in range(100)]})
df.head(3)
Output:
0   0
1   1
2   2

Когда мы пытаемся выполнить операцию с нарезанными данными.

h=df.loc[[0,1,2],['A']]
h.loc[:] = 12.3
h
Output of h:
0   12.3
1   12.3
2   22.3

Результаты не отражают то, как это произошло в вашем случае:

df.head(3)
Output:
0   0
1   1
2   2

Но когда вы делаете это tmp_df = df['X'], серия tmp_df имеет в виду к содержимому "X" в столбце df. Что должно измениться при изменении tmp_df.

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