Python和对象分配

Python和对象分配,python,pandas,dataframe,Python,Pandas,Dataframe,我最近开始学习python进行数据分析,当使用pandasDataFrame和Series时,我在试图理解对象赋值的一些情况时遇到了问题 首先,我明白更改一个对象的值不会更改第一个对象中指定值的另一个对象。典型的: a = 7 b = a a = 12 到目前为止,a=12和b=7。但使用熊猫时,我有以下情况: import pandas as pd my_df = pd.DataFrame({'Col1': [2, 7, 9],'Col2': [1, 6, 12],'Col3': [1, 6

我最近开始学习python进行数据分析,当使用pandas
DataFrame
Series
时,我在试图理解对象赋值的一些情况时遇到了问题


首先,我明白更改一个对象的值不会更改第一个对象中指定值的另一个对象。典型的:

a = 7
b = a
a = 12
到目前为止,
a=12
b=7
。但使用熊猫时,我有以下情况:

import pandas as pd
my_df = pd.DataFrame({'Col1': [2, 7, 9],'Col2': [1, 6, 12],'Col3': [1, 6, 9]})

pd_colnames = pd.Series(my_df.columns.values)
list_colnames = list(my_df.columns.values)
现在这两个对象包含相同的文本,一个作为
pd.Series
,另一个作为
list
。但如果我更改某些列名,则值会更改:

>>> my_df.columns.values[0:2] = ['a','b']

>>> pd_colnames
0       a
1       b
2    Col3
dtype: object

>>> list_colnames
['Col1', 'Col2', 'Col3']
有人能解释一下为什么使用内置的
列表
时,值没有改变,而使用
pandas.Series
时,值在我修改数据框时改变了

pandas.Series
中如何避免这种行为?我有一个数据框,其中的列名有时需要用英语,有时需要用西班牙语,我希望能够将它们作为
pandas.Series
对象保存,以便与它们交互。

这是因为
list()
正在
list_colnames=list(my_df.columns.values)
中创建一个新对象(副本)。这很容易测试:

a = [1, 2, 3]
b = list(a)
a[0] = 5
print(b)
---> [1, 2, 3]
创建该副本后,
list\u colnames
将与初始df(包括列名数组)完全分离

相反,
my_df.columns.values
允许您访问列名的基础numpy数组。您可以通过
打印(键入(my_df.columns.values))
看到这一点。从该数组创建
系列
时,它不需要创建副本,因此
系列
中的值仍然链接到
my_df
的列名(它们是相同的对象)


首先,我明白更改一个对象的值不会更改第一个对象中指定值的另一个对象

这仅适用于不可变类型(
int
float
bool
str
tuple
unicode
),而不适用于可变类型(
list
set
dict

>a=[1,2,3]
>>>b=a
>>>b[0]=4
>>>a
[4, 2, 3]

正在进行的是
list\u colnames
pd\u colnames
的副本(通过调用
list
函数),其中
pd\u colnames
是与
my\u df
相关的可变类型

“首先,我明白更改一个对象的值不会更改在第一个对象中指定值的另一个对象。”我不知道这是从哪里得到的,但对于可变值来说,这是完全不正确的。恰好整数是不可变的,所以您的第一个示例并没有演示列表或序列对象的行为。除此之外,我看到太多的人一直在做
一些\u Series.values.tolist()
列表(一些\u Series.values)
。大多数时候,这是完全没有必要的。在很少需要列表的情况下,只需使用
some_series.tolist()