首页Python【Python数据分析】1...

【Python数据分析】15.Pandas数据结构——DataFrame类型


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Data_Analysis/lab/index.html
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis

根据《Python for Data Analysis 3rd Edition》翻译整理

—————-————————————-

1.DataFrame类型介绍

DataFrame表示的是矩阵数据表格,包含一个有序的、命名的列集合,每个列可以是不同的值类型(数字、字符串、布尔值等)。

DataFrame有行索引(index)和列索引(column),因此可以被认为是一个共享相同索引的 Series 字典。

DataFrame常用于表达二维数据,但也可以通过分层索引的方式表达多维数据。

2.DataFrame类型的创建

与Series一样,通过向pd.DataFrame()方法传递数据的方式,实例化一个DataFrame对象。

DataFrame构造函数的有效输入主要有以下几种:

类型
说明
2D ndarray 数据的矩阵,行和类的标签是可选参数
数组、列表和元祖构成的字典 每个序列将成为DataFrame的一列,所有序列的长度必须相同
Numpy结构化/记录化数组 与数组构成的字典一致
Series构成的字典 每个值成为一列,每个Series的索引联合起来形成结果的行索引,,也可以显式地传递索引
字典构成的字典 每一个内部字典成为一列,键联合起来形成结果的索引
字典或Series构成的列表 列表中的一个元素形成DataFrame的一行,字典键或Series索引联合起来形成DataFrame的列标签
列表或元祖构成的列表 2D ndarray一致
其他DataFrame 如果不显式传递索引,则会使用原DataFrame的索引
NumPy MaskedArray 2D ndarray类似,但隐蔽值会在结果DataFrame中称为缺失值

  • 等长度列表组成的字典:

生成的DataFrame将自动分配索引,就像Series一样,并且列是根据数据中的键的顺序在字典中的插入顺序)来排列的。

 1>>> data = {'city':['India','Canada','France','Italy','USA','Spain'],
2       'continent':['Asia','North America','Europe','Europe','North America','Europe'],
3       'score':[90,80,50,70,60,40]}
4
5>>> df = pd.DataFrame(data)
6>>> df
7
8 city    continent    score
90    India   Asia     90
101    Canada  North America   80
112    France  Europe   50
123    Italy   Europe   70
134    USA  North America 60
145    Spain   Europe   40
  • 等长度ndarray数组组成的字典:

 1>>> data = {'one':np.array([0,1,2,3,4]) , 'two':np.array([5,6,7,8,9])}
2
3>>> df = pd.DataFrame(data)
4>>> df
5
6 one   two
70    0   5
81    1   6
92    2   7
103    3   8
114    4   9
  • 包含字典的字典类型:

字典的键将作为列,内部字典的键将作为行索引。

 1>>> data = {'Canada':{2000:80 , 2001:90 },
2       'France':{2000:70 , 2001:80},
3       'Italy':{2000:60 , 2001:852002:100}}
4
5>>> df = pd.DataFrame(data)
6>>> df
7
8      Canada    France  Italy
92000    80.0    70.0    60
102001    90.0    80.0    85
112002    NaN     NaN    100
  • 包含Series对象的字典:

 1>>> data = {'Canada':pd.Series([80,90],index=[2000,2001]),
2       'France':pd.Series([70,80],index=[2000,2001])}
3
4>>> df = pd.DataFrame(data)
5>>> df
6
7
8      Canada    France
92000    80       70
102001    90       80
  • 二维ndarray对象:

 1>>> data = np.arange(6).reshape(2,3)
2>>> data
3array([[012],
4       [345]])
5
6>>> df = pd.DataFrame(data)
7>>> df
8
9     0   1   2
100    0   1   2
111    3   4   5

3.指定列和索引

通过columns指定列的顺序,通过index指定索引。

 1>>> data = {'city':['India','Canada','France','Italy','USA','Spain'],
2       'continent':['Asia','North America','Europe','Europe','North America','Europe'],
3       'score':[90,80,50,70,60,40]}
4
5>>> df = pd.DataFrame(data , columns=['continent','city','score'] , index=['one','two','three','four','five','six'])
6>>> df
7
8
9        continent       city   score
10one     Asia            India    90
11two     North America   Canada   80
12three   Europe          France   50
13four    Europe          Italy    70
14five    North America   USA      60
15six     Europe          Spain    40

如果columns传递的列不在数据中,dataframe中会出现缺失值。

 1>>> df = pd.DataFrame(data , columns=['continent','city','score','year'] , index=['one','two','three','four','five','six'])
2>>> df
3
4       continent          city  score     year
5one      Asia            India    90     NaN
6two      North America   Canada   80     NaN
7three    Europe          France   50     NaN
8four     Europe          Italy    70     NaN
9five     North America    USA     60     NaN
10six      Europe          Spain    40     NaN

索引和列也拥有name属性,如果有的话会被显式出来。

 1>>> df.index.name = '索引名'
2>>> df.columns.name = '列名'
3>>> df
4
5列名    continent           city    score   year
6索引名                
7one       Asia             India     90    NaN
8two       North America    Canada    80    NaN
9three     Europe           France    50    NaN
10four      Europe           Italy     70    NaN
11five      North America    USA       60    NaN
12six      Europe            Spain     40    NaN

和Series类似,DataFrame的values属性会将包含在DataFrame中的数据以二维ndarray的形式返回。如果DataFrame中的列具有不同的数据类型dtype,会自动选择适合所有列的类型。

1>>> df.values
2array([['Asia''India'90, nan],
3       ['North America''Canada'80, nan],
4       ['Europe''France'50, nan],
5       ['Europe''Italy'70, nan],
6       ['North America''USA'60, nan],
7       ['Europe''Spain'40, nan]], dtype=object)

4.行和列的获取:

 1>>> data = {'city':['India','Canada','France','Italy','USA','Spain'],
2       'continent':['Asia','North America','Europe','Europe','North America','Europe'],
3       'score':[90,80,50,70,60,40]}
4
5>>> df = pd.DataFrame(data , columns=['continent','city','score'] , index=['one','two','three','four','five','six'])
6>>> df
7
8       continent           city     score
9one       Asia             India     90
10two       North America    Canada    80
11three     Europe           France    50
12four      Europe           Italy     70
13five      North America    USA       60
14six       Europe           Spain     40

4.1 列的获取

DataFrame中的一列,可以通过字典型标记或点属性的方式检索为Series对象。

TIPS:DataFrame[column]的方式 适用于任何列名,但 DataFrame.column 的方式仅在列名是有效的 Python 变量名并且不与 DataFrame 中的任何方法名冲突时才有效。例如,如果列的名称包含空格或下划线以外的符号,则不能使用点属性方法访问它。

 1>>> df['continent']
2one               Asia
3two      North America
4three           Europe
5four            Europe
6five     North America
7six             Europe
8Name: continent, dtype: object
9
10>>> df.city
11one       India
12two      Canada
13three    France
14four      Italy
15five        USA
16six       Spain
17Name: city, dtype: object

列的引用是可以修改的可以赋值为标量值或值数组。

 1>>> df['score'] = 100
2>>> df
3
4       continent         city     score
5one      Asia            India     100
6two      North America   Canada    100
7three    Europe          France    100
8four     Europe          Italy     100
9five     North America   USA       100
10six      Europe          Spain     100
11
12
13>>> df['score'] = np.array([100,90,80,70,60,50])
14>>> df
15
16       continent         city     score
17one      Asia            India     100
18two      North America   Canada    90
19three    Europe          France    80
20four     Europe          Italy     70
21five     North America   USA       60
22six      Europe          Spain     50

将Series赋值给一列时,Series的索引将会按照DataFrame的索引重新排序,并在空缺的地方填充缺失值。

 1>>> value = pd.Series([90,80,70] , index=['one','three','six'])
2
3>>> df['score'] = value
4>>> df
5
6       continent         city     score
7one      Asia            India     90.0
8two      North America   Canada    NaN
9three    Europe          France    80.0
10four     Europe          Italy     NaN
11five     North America   USA       NaN
12six      Europe          Spain     70.0

TIPS: 从DataFrame中选取的列是数据的视图,而不是拷贝。因此对Series的修改会映射到原DataFrame中。如需复制,需要使用copy方法进行显式操作。

如果被赋值的列并不存在,则会生成一个新的列。

 1>>> value = df['continent'] == 'Europe'
2>>> value
3one      False
4two      False
5three     True
6four      True
7five     False
8six       True
9Name: continent, dtype: bool
10
11>>> df['labels'] = value
12>>> df
13
14       continent         city     score    labels
15one      Asia            India     90.0     False
16two      North America   Canada    NaN      False
17three    Europe          France    80.0     True
18four     Europe          Italy     NaN      True
19five     North America   USA       NaN      False
20six      Europe          Spain     70.0     True

可以通过 del 关键字删除指定列。

 1>>> del df['labels']
2>>> df
3
4       continent         city     score    
5one      Asia            India     90.0     
6two      North America   Canada    NaN      
7three    Europe          France    80.0     
8four     Europe          Italy     NaN     
9five     North America   USA       NaN     
10six      Europe          Spain     70.0    

4.2 行的获取

行可以通过iloc或loc属性按位置或名称的方式进行选取。

 1>>> df.iloc[0]
2continent     Asia
3city         India
4score         90.0
5Nameonedtypeobject
6
7>>> df.loc['one']
8continent     Asia
9city         India
10score         90.0
11Nameonedtypeobject
5.head()和tail():
对于大型 DataFrame,head()方法仅选择前五行,tail()返回最后五行。
 1>>> data = {'city':['India','Canada','France','Italy','USA','Spain'],
2       'continent':['Asia','North America','Europe','Europe','North America','Europe'],
3       'score':[90,80,50,70,60,40]}
4
5>>> df = pd.DataFrame(data)
6>>> df
7
8     city    continent      score
90    India   Asia            90
101    Canada  North America   80
112    France  Europe          50
123    Italy   Europe          70
134    USA     North America   60
145    Spain   Europe          40
15
16>>> df.head()
17
18     city    continent      score
190    India   Asia            90
201    Canada  North America   80
212    France  Europe          50
223    Italy   Europe          70
234    USA     North America   60
24
25
26>>> df.tail()
27
28     city    continent      score
291    Canada  North America   80
302    France  Europe          50
313    Italy   Europe          70
324    USA     North America   60
335    Spain   Europe          40

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments