专业编程基础技术教程

网站首页 > 基础教程 正文

Pandas学习笔记-了解DataFrame pandas dataframe操作

ccvgpt 2024-10-28 13:17:44 基础教程 7 ℃


前言

本教程使用工具为Anaconda,推荐一本书《Python数据分析-活用pandas库》

Pandas学习笔记-了解DataFrame pandas dataframe操作


学习概要

  • import pandas as pd: 将 pandas包导入并重名为 pd
  • pd.read_excel:读取 excel 文件
  • DataFrame 属性 iloc: 用整数下标取 DataFrame 里的数据
  • DataFrame 属性 loc: 用索引名index + 列名取 DataFrame 里的数据
  • DataFrame 属性 columns: DataFrame对象中的所有列名
  • DataFrame 属性 shape: DataFrame对象中的行数和列数
  • DataFrame 属性 index: DataFrame对象中的所有索引
  • DataFrame 属性 dtypes: DataFrame对象中的所有字段的数据类型
  • DataFrame 方法 head: DataFrame对象中的前5行数据
  • DataFrame 方法 tail: DataFrame对象中的后5行数据
  • DataFrame 方法 groupby: 对DataFrame对象中的数据进行分组

读取 Excel 文件

  • 学习目的: 让大家可以自由地读取本地的 Excel 文件
  • 请用 import 导入 pandas 库, 你这样就可以直接使用 pandas 提供的各种类和函数了
  • import pandas
  • 有时大家觉得 pandas 太长了,也会用
  • import pandas as pd
  • 这样 pandas 导入进来了就有一新名字叫 pd
  • 当前目录下有一个名字叫 gapminder.xlsx的Excel 文件, 把它读到名为 df 的变量中
  • 这里是 gapminder.xlsx 的下载地址
  • 链接: https://pan.baidu.com/s/1dySc4a-rGtcogiMKFkO6Wg 提取码: eh55,
  • 请把这个文件放到和代码同一个目录中
  • read_excel 函数的更详细的用法可以看
  • 资料Link : https://blog.csdn.net/brucewong0516/article/details/79096633
  # 大家记住,这里 pd 和 pandas 是等价的哈
  df = pd.read_excel("gapminder.xlsx")
  • 查看 df 前面5行的数据

备注:

import pandas as pd
df = pd.read_excel("gapminder.xlsx")
df.head()

Out[4]:


country

continent

year

lifeExp

pop

gdpPercap

0

Afghanistan

Asia

1952

28.801

8425333

779.445314

1

Afghanistan

Asia

1957

30.332

9240934

820.853030

2

Afghanistan

Asia

1962

31.997

10267083

853.100710

3

Afghanistan

Asia

1967

34.020

11537966

836.197138

4

Afghanistan

Asia

1972

36.088

13079460

739.981106

检查 DataFrame 的信息

  • 查看 df 的数据类型是什么
  • 查看 df 有多少行,多少列
  • DataFrame 对象有一个名叫的 shape 的属性(属性是没有 "()" 的),它的类型是元组(tuple)
  • shape 的第一个值是行数,第二个值是列数
  • 查看 df 有哪些列名
  • 查看 df 每一列的数据类型
  • 调用 df.info(), 大家可以思考一下 memory usage是什么意思
  • 大家试着把 df 这个变量放到单元格的最后一行,然后执行单元格,看一下输出的表格是否变漂亮了
  • 我还给大家传授一个重要经验,一个单元格最好不要超过 10行代码,这样很好运行调试
print(type(df))
<class 'pandas.core.frame.DataFrame'>
print("df 的大小: ", df.shape)
print("df 的行数: ", df.shape[0])
print("df 的列数: ", df.shape[1])
df 的大小:  (1704, 6)
df 的行数:  1704
df 的列数:  6
 查看 df 有哪些列名
# 第一种查看方式
print(df.columns)
# 第二种查看方式
for col in df.columns:
    print(col)
Index(['country', 'continent', 'year', 'lifeExp', 'pop', 'gdpPercap'], dtype='object')
country
continent
year
lifeExp
pop
gdpPercap
#查看 df 每一列的数据类型
df.dtypes
country       object
continent     object
year           int64
lifeExp      float64
pop            int64
gdpPercap    float64
dtype: object
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1704 entries, 0 to 1703
Data columns (total 6 columns):
 #   Column     Non-Null Count  Dtype  
---  ------     --------------  -----  
 0   country    1704 non-null   object 
 1   continent  1704 non-null   object 
 2   year       1704 non-null   int64  
 3   lifeExp    1704 non-null   float64
 4   pop        1704 non-null   int64  
 5   gdpPercap  1704 non-null   float64
dtypes: float64(2), int64(2), object(2)
memory usage: 80.0+ KB
notebook 会把 DataFrame 以一个很漂亮的格式显示出来df



country

continent

year

lifeExp

pop

gdpPercap

0

Afghanistan

Asia

1952

28.801

8425333

779.445314

1

Afghanistan

Asia

1957

30.332

9240934

820.853030

2

Afghanistan

Asia

1962

31.997

10267083

853.100710

3

Afghanistan

Asia

1967

34.020

11537966

836.197138

4

Afghanistan

Asia

1972

36.088

13079460

739.981106

...

...

...

...

...

...

...

1699

Zimbabwe

Africa

1987

62.351

9216418

706.157306

1700

Zimbabwe

Africa

1992

60.377

10704340

693.420786

1701

Zimbabwe

Africa

1997

46.809

11404948

792.449960

1702

Zimbabwe

Africa

2002

39.989

11926563

672.038623

1703

Zimbabwe

Africa

2007

43.487

12311143

469.709298

1704 rows × 6 columns

DataFrame 常用操作1

  • 获取 df 的前 10行,放到变量 df1 中
  • 提示,可以使用 head 函数,里面有一个数量参数 n
  • 获取 df 的后 20行,放到变量 df2 中
  • 提示,可以使用 tail 函数,里面有一个数量参数 n
df1 =  df.head(n=10)
print(type(df1))
df1
<class 'pandas.core.frame.DataFrame'>


country

continent

year

lifeExp

pop

gdpPercap

0

Afghanistan

Asia

1952

28.801

8425333

779.445314

1

Afghanistan

Asia

1957

30.332

9240934

820.853030

2

Afghanistan

Asia

1962

31.997

10267083

853.100710

3

Afghanistan

Asia

1967

34.020

11537966

836.197138

4

Afghanistan

Asia

1972

36.088

13079460

739.981106

5

Afghanistan

Asia

1977

38.438

14880372

786.113360

6

Afghanistan

Asia

1982

39.854

12881816

978.011439

7

Afghanistan

Asia

1987

40.822

13867957

852.395945

8

Afghanistan

Asia

1992

41.674

16317921

649.341395

9

Afghanistan

Asia

1997

41.763

22227415

635.341351

df2 =  df.tail(n=20)
print(type(df2))
df2
<class 'pandas.core.frame.DataFrame'>


country

continent

year

lifeExp

pop

gdpPercap

1684

Zambia

Africa

1972

50.107

4506497

1773.498265

1685

Zambia

Africa

1977

51.386

5216550

1588.688299

1686

Zambia

Africa

1982

51.821

6100407

1408.678565

1687

Zambia

Africa

1987

50.821

7272406

1213.315116

1688

Zambia

Africa

1992

46.100

8381163

1210.884633

1689

Zambia

Africa

1997

40.238

9417789

1071.353818

1690

Zambia

Africa

2002

39.193

10595811

1071.613938

1691

Zambia

Africa

2007

42.384

11746035

1271.211593

1692

Zimbabwe

Africa

1952

48.451

3080907

406.884115

1693

Zimbabwe

Africa

1957

50.469

3646340

518.764268

1694

Zimbabwe

Africa

1962

52.358

4277736

527.272182

1695

Zimbabwe

Africa

1967

53.995

4995432

569.795071

1696

Zimbabwe

Africa

1972

55.635

5861135

799.362176

1697

Zimbabwe

Africa

1977

57.674

6642107

685.587682

1698

Zimbabwe

Africa

1982

60.363

7636524

788.855041

1699

Zimbabwe

Africa

1987

62.351

9216418

706.157306

1700

Zimbabwe

Africa

1992

60.377

10704340

693.420786

1701

Zimbabwe

Africa

1997

46.809

11404948

792.449960

1702

Zimbabwe

Africa

2002

39.989

11926563

672.038623

1703

Zimbabwe

Africa

2007

43.487

12311143

469.709298

DataFrame 常用操作1


备注:

  • iloc 是 DataFrame 的里一个属性,就像 shape 一样, 然后我们通过 [] 来取数,而不是通过 ()
  • 使用 iloc 操作 DataFrame
  • i 表示 integer(整数), loc 代表 location (位置)
  • iloc 通过整数来标明要操作的数据位置, 类似我们操作列表
a = [1,2,3,4]
a[1]
a[1:3]

题目:

  • 取 df 的第1行,放到 df2 中
  • 取 df 的最后1行,放到 df3 中
  • 取 df 的第一列,放到 df4 中
  • 取 df 的第0,2,3列,放到 df5中
  • 大家做每一道题时,都查看取来的数据的类型, (使用 type 函数),大家想想为什么
#取 df 的第1行,放到 df2 中 
df2 = df.iloc[0,:]
print(type(df2))
df2
<class 'pandas.core.series.Series'>
country      Afghanistan
continent           Asia
year                1957
lifeExp           30.332
pop              9240934
gdpPercap        820.853
Name: 1, dtype: object
# 取 df 的最后1行,放到 df3 中
df3 = df.iloc[-1,:]
print(type(df3))
df3
<class 'pandas.core.series.Series'>
country      Zimbabwe
continent      Africa
year             2007
lifeExp        43.487
pop          12311143
gdpPercap     469.709
Name: 1703, dtype: object
# 取 df 的第一列,放到 df4 中
df4 = df.iloc[:,0]
print(type(df4))
df4
<class 'pandas.core.series.Series'>
0         Asia
1         Asia
2         Asia
3         Asia
4         Asia
         ...  
1699    Africa
1700    Africa
1701    Africa
1702    Africa
1703    Africa
Name: continent, Length: 1704, dtype: object
#取 df 的第0,2,3列,放到 df5中
df5 = df.iloc[:,[0,2,3]]
print(type(df5))
df5
<class 'pandas.core.frame.DataFrame'>


country

year

lifeExp

0

Afghanistan

1952

28.801

1

Afghanistan

1957

30.332

2

Afghanistan

1962

31.997

3

Afghanistan

1967

34.020

4

Afghanistan

1972

36.088

...

...

...

...

1699

Zimbabwe

1987

62.351

1700

Zimbabwe

1992

60.377

1701

Zimbabwe

1997

46.809

1702

Zimbabwe

2002

39.989

1703

Zimbabwe

2007

43.487

1704 rows × 3 columns

DataFrame 重要概念

这是 Pandas里最难的概念部分,如果大家一次学不会也很正常
  • 什么叫索引(index)
  • 故名思意,索引就是用来帮我们找到 DataFrame 里数据的标签
  • DataFrame 默认自带的整数索引
  • DataFrame 各种特列类型索引(以后章节会细讲,本次了解一下就好)
# 访问索引是有一个名叫 index 的属性
df.index
RangeIndex(start=0, stop=1704, step=1)

DataFrame 常用操作2


备注:

  • loc 是 DataFrame 的里一个属性,就像 shape 一样, 然后我们通过 [] 来取数,而不是通过 ()* 使用 loc 操作 DataFrame
  • loc 就是 location 的意思
  • loc 里第一个参数是索引编号(类似于行号),如果索引是什么,就传什么
  • loc 里第二个参数列的名字(iloc传的是列的编号), 一般是字符串

题目:

  • 请一定使用 loc 来操作
  • 取 df 的第1行,放到 df2 中
  • 取 df 的最后1行,放到 df3 中 (注意,loc 不支持 -1 这个操作,大家想想要怎么做)
  • 取 df 的 "country" 列,放到 df4 中
  • 取 df 的 ["year","pop"] 列,放到 df5中
  • 取 df 的前5行,["year","pop"] 列,放到 df6中
  • 大家做每一道题时,都查看取来的数据的类型, (使用 type 函数),大家想想为什么
# 取 df 的第1行,放到 df2 中 
df2 = df.loc[0,:]
print(type(df2))
df2
<class 'pandas.core.series.Series'>
country      Afghanistan
continent           Asia
year                1957
lifeExp           30.332
pop              9240934
gdpPercap        820.853
Name: 1, dtype: object
# 取 df 的最后1行,放到 df3 中
last_row = df.shape[0]-1
df3 = df.loc[last_row,:]
print(type(df3))
df3
<class 'pandas.core.series.Series'>
country      Zimbabwe
continent      Africa
year             2007
lifeExp        43.487
pop          12311143
gdpPercap     469.709
Name: 1703, dtype: object
# 取 df 的 "country" 列,放到 df4 中
df4 = df.loc[:,'country']
print(type(df4))
df4
<class 'pandas.core.series.Series'>
0       Afghanistan
1       Afghanistan
2       Afghanistan
3       Afghanistan
4       Afghanistan
           ...     
1699       Zimbabwe
1700       Zimbabwe
1701       Zimbabwe
1702       Zimbabwe
1703       Zimbabwe
Name: country, Length: 1704, dtype: object
df


country

continent

year

lifeExp

pop

gdpPercap

0

Afghanistan

Asia

1952

28.801

8425333

779.445314

1

Afghanistan

Asia

1957

30.332

9240934

820.853030

2

Afghanistan

Asia

1962

31.997

10267083

853.100710

3

Afghanistan

Asia

1967

34.020

11537966

836.197138

4

Afghanistan

Asia

1972

36.088

13079460

739.981106

...

...

...

...

...

...

...

1699

Zimbabwe

Africa

1987

62.351

9216418

706.157306

1700

Zimbabwe

Africa

1992

60.377

10704340

693.420786

1701

Zimbabwe

Africa

1997

46.809

11404948

792.449960

1702

Zimbabwe

Africa

2002

39.989

11926563

672.038623

1703

Zimbabwe

Africa

2007

43.487

12311143

469.709298

1704 rows × 6 columns

# 取 df 的 ["year","pop"] 列,放到 df5中
df5 = df.loc[:,["year","pop"]]
print(type(df5))
df5
<class 'pandas.core.frame.DataFrame'>


year

pop

0

1952

8425333

1

1957

9240934

2

1962

10267083

3

1967

11537966

4

1972

13079460

...

...

...

1699

1987

9216418

1700

1992

10704340

1701

1997

11404948

1702

2002

11926563

1703

2007

12311143

1704 rows × 2 columns

# 取 df 的前5行,["year","pop"] 列,放到 df6中
top5 = range(5)
df6 = df.loc[top5,['year','pop']]
print(type(df6))
df6
<class 'pandas.core.frame.DataFrame'>


year

pop

0

1952

8425333

1

1957

9240934

2

1962

10267083

3

1967

11537966

4

1972

13079460

分组和聚合计算


备注:

  • 这一部分类似于数据库的 SQL 语言
  • 如果大家学会了,就可开始进入了数据分析师的大门

题目:

  • 按年 'year' 分组(groupby),然后统计人口 'pop' 总数 (sum函数)
  • 按国家 'country' 分组(groupby),然后统计人口 'pop' 总数(sum函数)
  • 按年 'year' 分组(groupby),然后统计预期寿命 'lifeExp' 平均数(mean函数)
#按年 'year' 分组(groupby),然后统计人口 'pop' 总数 (sum函数)
df.groupby(['year'])['pop'].sum()
year
1952    2406957150
1957    2664404580
1962    2899782974
1967    3217478384
1972    3576977158
1977    3930045807
1982    4289436840
1987    4691477418
1992    5110710260
1997    5515204472
2002    5886977579
2007    6251013179
Name: pop, dtype: int64
#按年 'year' 分组(groupby),然后统计预期寿命 'lifeExp' 
平均数(mean函数)
df.groupby(['year'])['lifeExp'].mean()
year
1952    49.057620
1957    51.507401
1962    53.609249
1967    55.678290
1972    57.647386
1977    59.570157
1982    61.533197
1987    63.212613
1992    64.160338
1997    65.014676
2002    65.694923
2007    67.007423
Name: lifeExp, dtype: float64
#按国家 'country' 分组(groupby),然后统计人口 'pop' 总数(sum函数)
df.groupby(['country'])['pop'].sum()
country
Afghanistan           189884585
Albania                30962990
Algeria               238504874
Angola                 87712681
Argentina             343226879
                        ...    
Vietnam               654822851
West Bank and Gaza     22183278
Yemen, Rep.           130118302
Zambia                 76245658
Zimbabwe               91703593
Name: pop, Length: 142, dtype: int64

学习资料Link

  • read_excel 函数的更详细的用法

https://blog.csdn.net/brucewong0516/article/details/79096633

Tags:

最近发表
标签列表