当前位置:   article > 正文

认识pandas_pandas库的特点

pandas库的特点

1 认识pandas

Pandas 是一个开源的第三方 Python 库,从 Numpy 和 Matplotlib 的基础上构建而来,享有数据分析“三剑客之一”的盛名(NumPy、Matplotlib、Pandas)。Pandas 已经成为 Python 数据分析的必备高级工具,它的目标是成为强大、灵活、可以支持任何编程语言的数据分析工具。

1.1 pandas主要特点

Pandas 主要包括以下几个特点:

  • 它提供了一个简单、高效、带有默认标签(也可以自定义标签)的 DataFrame 对象。

  • 能够快速得从不同格式的文件中加载数据(比如 Excel、CSV 、SQL文件),然后将其转换为可处理的对象;

  • 能够按数据的行、列标签进行分组,并对分组后的对象执行聚合和转换操作;

  • 能够很方便地实现数据归一化操作和缺失值处理;

  • 能够很方便地对 DataFrame 的数据列进行增加、修改或者删除的操作;

  • 能够处理不同格式的数据集,比如矩阵数据、异构数据表、时间序列等;

  • 提供了多种处理数据集的方式,比如构建子集、切片、过滤、分组以及重新排序等。

1.2 pandas的优势

与其它语言的数据分析包相比,Pandas 具有以下优势

  • Pandas 的 DataFrame 和 Series 构建了适用于数据分析的存储结构;

  • Pandas 简洁的 API 能够让你专注于代码的核心层面;

  • Pandas 实现了与其他库的集成,比如 Scipy、scikit-learn 和 Matplotlib;

1.3 下载安装

pip install pandas

2 pandas内置数据结构

  • Series 是带标签的一维数组,这里的标签可以理解为索引,但这个索引并不局限于整数,它也可以是字符类型,比如 a、b、c 等;

  • DataFrame 是一种表格型数据结构,它既有行标签,又有列标签。

数据结构维度说明
Series1该结构能够存储各种数据类型,比如字符数、整数、浮点数、Python 对象等,Series 用 name 和 index 属性来描述 数据值。Series 是一维数据结构,因此其维数不可以改变。
DataFrame2DataFrame 是一种二维表格型数据的结构,既有行索引,也有列索引。行索引是 index,列索引是 columns。 在创建该结构时,可以指定相应的索引值。

2.1 Pandas Series

2.1.1 创建series对象

  • Pandas 使用 Series() 函数来创建 Series 对象,通过这个对象可以调用相应的方法和属性,从而达到处理数据的目的

import pandas as pd
seriec_obj = pd.Series(data, index, dtype, copy)
​
# data  输入的数据,可以是列表、常量、ndarray 数组等。
# index 索引值必须是惟一的,如果没有传递索引,则默认为 np.arrange(n)。
# dtype dtype表示数据类型,如果没有提供,则会自动判断得出。
# copy  表示对 data 进行拷贝,默认为 False。
  • ndarray创建Series对象
  1. arr_one = np.array(['a', 'b', 'c', 'd'])
  2. arr_obj = pd.Series(arr_one, index=('a', 'b', 'c', 'd'))
  3. arr_obj_two = pd.Series(arr_one, index=(1, 2, 3, 4))
  4. print(arr_obj)
  5. print("arr_obj_two为:\n", arr_obj_two)
  6. 代码的运行结果为:
  7. a a
  8. b b
  9. c c
  10. d d
  11. dtype: object
  12. arr_obj_two为:
  13. 1 a
  14. 2 b
  15. 3 c
  16. 4 d
  17. dtype: object

ndarray 是 NumPy 中的数组类型,当 data 是 ndarry 时,传递的索引必须具有与数组相同的长度。假如没有给 index 参数传参,在默认情况下,索引值将使用是 range(n) 生成,其中 n 代表数组长度

上述示例中没有传递任何索引,所以索引默认从 0 开始分配 ,其索引范围为 0 到len(data)-1,即 0 到 3。这种设置方式被称为“隐式索引”。

  • “显式索引”的方法定义索引标签
  1. arr_str = np.array(['张三', '李四', '王五', '赵六'])
  2. # 自定义索引标签(即显示索引)
  3. ser_obj = pd.Series(arr_str, index=[1, 2, 3, 4])
  4. print(ser_obj)
  5. 代码的运行结果为:
  6. 1 张三
  7. 2 李四
  8. 3 王五
  9. 4 赵六
  10. dtype: object
  • dict创建Series对象
  1. data = {'a': 0., 'b': 1., 'c': 2.}
  2. ser_data = pd.Series(data)
  3. print(ser_data)
  4. 代码的运行结果为:
  5. a 0.0
  6. b 1.0
  7. c 2.0
  8. dtype: float64

您可以把 dict 作为输入数据。如果没有传入索引时会按照字典的键来构造索引;反之,当传递了索引时需要将索引标签与字典中的值一一对应

  1. data = {'a': 0., 'b': 1., 'c': 2.}
  2. ser_data = pd.Series(data, index=['b', 'c', 'd', 'a'])
  3. print(ser_data)
  4. 代码的运行结果为:
  5. b 1.0
  6. c 2.0
  7. d NaN
  8. a 0.0
  9. dtype: float64

当传递的索引值无法找到与其对应的值时,使用 NaN(非数字)填充。

  • 标量创建Series对象
  1. ser_data = pd.Series(5, index=[0, 1, 2, 3])
  2. print(ser_data)
  3. 代码的运行结果为:
  4. 0 5
  5. 1 5
  6. 2 5
  7. 3 5
  8. dtype: int64

2.1.2 访问Series数据

访问 Series 序列中元素,分为两种方式,一种是位置索引访问;另一种是索引标签访问。

  • 位置索引访问
  1. ser_data = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
  2. print(ser_data)
  3. print(ser_data[0]) # 位置下标
  4. print(ser_data['a']) # 标签下标
  5. print(ser_data['b'])
  6. 代码的运行结果为:
  7. a 1
  8. b 2
  9. c 3
  10. d 4
  11. e 5
  12. dtype: int64
  13. 1
  14. 1
  15. 2

这种访问方式与 ndarray 和 list 相同,使用元素自身的下标进行访问。我们知道数组的索引计数从 0 开始,这表示第一个元素存储在第 0 个索引位置上,以此类推,就可以获得 Series 序列中的每个元素

通过切片的方式访问 Series 序列中的数据

  1. ser_data = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
  2. print(ser_data[:3])
  3. print(ser_data[:7])
  4. print(ser_data[1:3])
  5. 代码的运行结果为:
  6. a 1
  7. b 2
  8. c 3
  9. dtype: int64
  10. a 1
  11. b 2
  12. c 3
  13. d 4
  14. e 5
  15. dtype: int64
  16. b 2
  17. c 3
  18. dtype: int64
  • 索引标签访问

Series 类似于固定大小的 dict,把 index 中的索引标签当做 key,而把 Series 序列中的元素值当做 value,然后通过 index 索引标签来访问或者修改元素值。

  1. ser_data = pd.Series([6, 7, 8, 9, 10], index=['a', 'b', 'c', 'd', 'e'])
  2. print(ser_data[['a', 'c', 'd']])
  3. 代码的运行结果:
  4. a 6
  5. c 8
  6. d 9
  7. dtype: int64

2.1.3 Series常用属性

名称属性
axes以列表的形式返回所有行索引标签。
dtype返回对象的数据类型。
empty返回一个空的 Series 对象。
ndim返回输入数据的维数。
size返回输入数据的元素数量。
values以 ndarray 的形式返回 Series 对象。
index返回一个RangeIndex对象,用来描述索引的取值范围。
  1. ser_data = pd.Series(np.array([10, 20, 30, 40, 50]))
  2. print("ser_data:\n", ser_data)
  3. print("axes:\n", ser_data.axes)
  4. print("dtype为:\n", ser_data.dtype)
  5. print("empty:\n", ser_data.empty)
  6. print("ndim:\n", ser_data.ndim)
  7. print("size:\n", ser_data.size)
  8. print("values:\n", ser_data.values)
  9. print("index:\n", ser_data.index)
  10. 代码的运行结果为:
  11. ser_data:
  12. 0 10
  13. 1 20
  14. 2 30
  15. 3 40
  16. 4 50
  17. dtype: int32
  18. axes:
  19. [RangeIndex(start=0, stop=5, step=1)]
  20. dtype为:
  21. int32
  22. empty:
  23. False
  24. ndim:
  25. 1
  26. size:
  27. 5
  28. values:
  29. [10 20 30 40 50]
  30. index:
  31. RangeIndex(start=0, stop=5, step=1)

2.1.4 Series常用方法

2.1.4.1 head()&tail()
  • 如果想要查看 Series 的某一部分数据,可以使用 head() 或者 tail() 方法

  1. ser_data = pd.Series(np.random.randn(5))
  2. print(ser_data)
  3. # 返回前三行数据
  4. print(ser_data.head(3))
  5. 代码的运行结果为:
  6. 0 1.863595
  7. 1 -1.478136
  8. 2 -0.632712
  9. 3 -0.046976
  10. 4 1.435217
  11. dtype: float64
  12. 0 1.863595
  13. 1 -1.478136
  14. 2 -0.632712
  15. dtype: float64

head() 返回前 n 行数据,默认显示前 5 行数据

  1. ser_data = pd.Series(np.array([1, 2, 3, 4, 5, 6, 7]))
  2. print(ser_data.tail)
  3. # 返回后三行数据
  4. print(ser_data.tail(3))
  5. 代码的运行结果:
  6. 1 2
  7. 2 3
  8. 3 4
  9. 4 5
  10. 5 6
  11. 6 7
  12. dtype: int32>
  13. 4 5
  14. 5 6
  15. 6 7
  16. dtype: int32

tail() 返回的是后 n 行数据,默认为后 5 行

2.1.4.2 isnull()&nonull()
  • isnull() 和 nonull() 用于检测 Series 中的缺失值。所谓缺失值,顾名思义就是值不存在、丢失、缺少。

  • 在实际的数据分析任物中,数据的收集往往要经历一个繁琐的过程。在这个过程中难免会因为一些不可抗力,或者人为因素导致数据丢失的现象。这时,我们可以使用相应的方法对缺失值进行处理,比如数据补齐等方法。

  1. # None代表缺失数据
  2. ser_data = pd.Series([1, 2, 5, None])
  3. print(pd.isnull(ser_data)) # 是空值返回True
  4. 代码的运行结果为:
  5. 0 False
  6. 1 False
  7. 2 False
  8. 3 True
  9. dtype: bool

isnull():如果为值不存在或者缺失,则返回 True。

  1. # None代表缺失数据
  2. ser_data = pd.Series([1, 2, 5, None])
  3. print(pd.notnull(ser_data)) # 空值返回False
  4. 代码的运行结果为:
  5. 0 True
  6. 1 True
  7. 2 True
  8. 3 False
  9. dtype: bool

notnull():如果值不存在或者缺失,则返回 False。

2.2 Pandas DataFrame

  • DataFrame 是 Pandas 的重要数据结构之一,也是在使用 Pandas 进行数据分析过程中最常用的结构之一,可以这么说,掌握了 DataFrame 的用法,你就拥有了学习数据分析的基本能力。

  • DataFrame 一个表格型的数据结构,既有行标签(index),又有列标签(columns),它也被称异构数据表,所谓异构,指的是表格中每列的数据类型可以不同,比如可以是字符串、整型或者浮点型等。

url

  • DataFrame 结构类似于 Execl 的表格型,表格中列标签的含义如下所示:

indexstudent_idstudent_namestudent_num
01001James82.6
11002Pitter76.5
21003Jack92.3
31004Alice88.5

同 Series 一样,DataFrame 自带行标签索引,默认为“隐式索引”即从 0 开始依次递增,行标签与 DataFrame 中的数据项一一对应。上述表格的行标签从 0 到 3,共记录了 4 条数据(图中将行标签省略)。当然你也可以用“显式索引”的方式来设置行标签。

下面对 DataFrame 数据结构的特点做简单地总结,如下所示:

  • DataFrame 每一列的标签值允许使用不同的数据类型;

  • DataFrame 是表格型的数据结构,具有行和列;

  • DataFrame 中的每个数据值都可以被修改。

  • DataFrame 结构的行数、列数允许增加或者删除;

  • DataFrame 有两个方向的标签轴,分别是行标签和列标签;

  • DataFrame 可以对行和列执行算术运算。

2.2.1 创建DataFrame对象

  • 使用下列方式创建一个空的 DataFrame,这是 DataFrame 最基本的创建方法

  1. df = pd.DataFrame()
  2. print(df)
  3. 代码的运行结果为:
  4. Empty DataFrame
  5. Columns: []
  6. Index: []
  • 列表创建DataFame对象
  1. data = [1, 2, 3, 4, 5]
  2. df = pd.DataFrame(data)
  3. print(df)
  4. 代码的运行结果为:
  5. 0
  6. 0 1
  7. 1 2
  8. 2 3
  9. 3 4
  10. 4 5

使用嵌套列表创建 DataFrame 对象

  1. data = [['Alex', 10], ['Bob', 12], ['Clarke', 13]]
  2. df = pd.DataFrame(data, columns=['Name', 'Age'])
  3. print(df)
  4. 代码的运行结果为:
  5. Name Age
  6. 0 Alex 10
  7. 1 Bob 12
  8. 2 Clarke 13
  • 字典嵌套列表创建
  1. data = {'Name': ['Tom', 'Jack', 'Steve', 'Ricky'], 'Age': [28, 34, 29, 42]}
  2. df = pd.DataFrame(data)
  3. print(df)
  4. 代码的运行结果为:
  5. Name Age
  6. 0 Tom 28
  7. 1 Jack 34
  8. 2 Steve 29
  9. 3 Ricky 42

data 字典中,键对应的值的元素长度必须相同(也就是列表长度相同)。如果传递了索引,那么索引的长度应该等于数组的长度;如果没有传递索引,那么默认情况下,索引将是 range(n),其中 n 代表数组长度。

添加自定义的行标签

  1. data = {'Name': ['Tom', 'Jack', 'Steve', 'Ricky'], 'Age': [28, 34, 29, 42]}
  2. df = pd.DataFrame(data, index=['rank1', 'rank2', 'rank3', 'rank4'])
  3. print(df)
  4. 代码的运行结果为:
  5. Name Age
  6. rank1 Tom 28
  7. rank2 Jack 34
  8. rank3 Steve 29
  9. rank4 Ricky 42
  • 列表嵌套字典创建DataFrame对象
  1. data = [{'num': 1, 'result': 2}, {'num': 5, 'result': 10, 'number': 20}]
  2. df = pd.DataFrame(data, index=['first', 'second'])
  3. print(df)
  4. 代码的运行结果为:
  5. num result number
  6. first 1 2 NaN
  7. second 5 10 20.0

如果其中某个元素值缺失,也就是字典的 key 无法找到对应的 value,将使用 NaN 代替。

使用字典嵌套列表以及行、列索引表创建一个 DataFrame 对象。

  1. data = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
  2. df1 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b'])
  3. df2 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'b1'])
  4. df3 = pd.DataFrame(data, index=['first', 'second'], columns=['a', 'c'])
  5. print("df1为:\n", df1)
  6. print("df2为:\n", df2)
  7. print("df3为:\n",df3)
  8. 代码的运行结果为:
  9. df1为:
  10. a b
  11. first 1 2
  12. second 5 10
  13. df2为:
  14. a b1
  15. first 1 NaN
  16. second 5 NaN
  17. df3为:
  18. a c
  19. first 1 NaN
  20. second 5 20.0
  • Series创建DataFrame对象

    传递一个字典形式的 Series,从而创建一个 DataFrame 对象,其输出结果的行索引是所有 index 的合集

  1. dict_data = {
  2. 'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
  3. 'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
  4. }
  5. df = pd.DataFrame(dict_data)
  6. print(df)
  7. 代码的运行结果为:
  8. one two
  9. a 1.0 1
  10. b 2.0 2
  11. c 3.0 3
  12. d NaN 4

2.2.2 列索引操作DataFrame

DataFrame 可以使用列索(columns index)引来完成数据的选取、添加和删除操作。

  • 列索引选取数据列
  1. dict_data = {
  2. 'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
  3. 'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
  4. }
  5. df = pd.DataFrame(dict_data)
  6. print(df['one'])
  7. 代码的运行结果为:
  8. a 1.0
  9. b 2.0
  10. c 3.0
  11. d NaN
  12. Name: one, dtype: float64
  • 列索引添加数据列
  1. dict_data = {
  2. 'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
  3. 'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
  4. }
  5. df = pd.DataFrame(dict_data)
  6. # 使用df['列']=值,插入新的数据列
  7. df['three'] = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
  8. print(df)
  9. # 将已经存在的数据列做相加运算
  10. df['four'] = df['one'] + df['three']
  11. print(df)
  12. 代码的运行结果为:
  13. one two three
  14. a 1.0 1 10.0
  15. b 2.0 2 20.0
  16. c 3.0 3 30.0
  17. d NaN 4 NaN
  18. one two three four
  19. a 1.0 1 10.0 11.0
  20. b 2.0 2 20.0 22.0
  21. c 3.0 3 30.0 33.0
  22. d NaN 4 NaN NaN

除了使用df[]=value的方式外,您还可以使用 insert() 方法插入新的列

  1. info = [['Jack', 18], ['Helen', 19], ['John', 17]]
  2. df = pd.DataFrame(info, columns=['name', 'age'])
  3. print(df)
  4. # 注意是column参数
  5. # 数值1代表插入到columns列表的索引位置
  6. df.insert(1, column='score', value=[91, 90, 75])
  7. print(df)
  8. 代码的运行结果为:
  9. name age
  10. 0 Jack 18
  11. 1 Helen 19
  12. 2 John 17
  13. name score age
  14. 0 Jack 91 18
  15. 1 Helen 90 19
  16. 2 John 75 17
  • 这里需要注意的是使用insert函数的时候,传入的value值,传入的数据一定要与原数据列表的数量相同!!!

  • 列索引删除数据列

    通过 del 和 pop() 都能够删除 DataFrame 中的数据列

2.2.3 行索引操作DataFrame

理解了上述的列索引操作后,行索引操作就变的简单。下面看一下,如何使用行索引来选取 DataFrame 中的数据。

  • 标签索引选取

    可以将行标签传递给 loc 函数,来选取数据

  1. dict_data = {
  2. 'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
  3. 'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
  4. }
  5. df = pd.DataFrame(dict_data)
  6. print(df)
  7. print(df.loc[..., "one"])
  8. print(df.loc['b', 'one'])
  9. 代码的运行结果为:
  10. one two
  11. a 1.0 1
  12. b 2.0 2
  13. c 3.0 3
  14. d NaN 4
  15. a 1.0
  16. b 2.0
  17. c 3.0
  18. d NaN
  19. Name: one, dtype: float64
  20. 2.0
  • 整数索引选取

    通过将数据行所在的索引位置传递给 iloc 函数,也可以实现数据行选取

  1. dict_data = {
  2. 'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
  3. 'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
  4. }
  5. df = pd.DataFrame(dict_data)
  6. print(df)
  7. print(df.iloc[2])
  8. print(df.iloc[1, :])
  9. 代码的运行结果为:
  10. one two
  11. a 1.0 1
  12. b 2.0 2
  13. c 3.0 3
  14. d NaN 4
  15. one 3.0
  16. two 3.0
  17. Name: c, dtype: float64
  18. one 2.0
  19. two 2.0
  20. Name: b, dtype: float64
  • 切片操作多行选取

    可以使用切片的方式同时选取多行

  1. dict_data = {
  2. 'one': pd.Series([1, 2, 3], index=['a', 'b', 'c']),
  3. 'two': pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
  4. }
  5. df = pd.DataFrame(dict_data)
  6. print(df)
  7. # 左闭右开
  8. print(df[2:4])
  9. 代码的运行结果为:
  10. one two
  11. a 1.0 1
  12. b 2.0 2
  13. c 3.0 3
  14. d NaN 4
  15. one two
  16. c 3.0 3
  17. d NaN 4
  • 添加数据行

    使用 append() 函数,可以将新的数据行添加到 DataFrame 中,该函数会在行末追加数据行

  1. df = pd.DataFrame([[1, 2], [3, 4]], columns=['a', 'b'])
  2. df2 = pd.DataFrame([[5, 6], [7, 8]], columns=['a', 'b'])
  3. print("df\n", df)
  4. print("df2\n", df2)
  5. # 在行末追加新数据行
  6. df = df._append(df2)
  7. print(df)
  8. 代码的运行结果为:
  9. df
  10. a b
  11. 0 1 2
  12. 1 3 4
  13. df2
  14. a b
  15. 0 5 6
  16. 1 7 8
  17. a b
  18. 0 1 2
  19. 1 3 4
  20. 0 5 6
  21. 1 7 8
  • 删除数据行

    使用行索引标签,从 DataFrame 中删除某一行数据。如果索引标签存在重复,那么它们将被一起删除

  1. df = pd.DataFrame([[1, 2], [3, 4]], columns=['a', 'b'])
  2. df2 = pd.DataFrame([[5, 6], [7, 8]], columns=['a', 'b'])
  3. df = df._append(df2)
  4. print(df)
  5. # 注意此处调用了drop()方法
  6. df = df.drop(0)
  7. print(df)
  8. 代码的运行结果为:
  9. a b
  10. 0 1 2
  11. 1 3 4
  12. 0 5 6
  13. 1 7 8
  14. a b
  15. 1 3 4
  16. 1 7 8

2.2.4 DataFrame切片

  • 直接使用中括号时:

    • 索引优先对列进行操作

    • 切片优先对行进行操作

  1. dict_data = pd.DataFrame(
  2. data=np.random.randint(60, 90, size=(5, 6)),
  3. index=['张三', '李四', '王五', '赵六', '坤哥'],
  4. columns=["语文", "数学", "英语", "地理", "历史", "化学"]
  5. )
  6. print(dict_data)
  7. # 行切片
  8. print(dict_data[1:3])
  9. print(dict_data["张三":"赵六"])
  10. # 列切片
  11. # 对列作切片,也必须先对行做切片
  12. print(dict_data.iloc[:, 1:4])
  13. print(dict_data.loc[:, "数学":"化学"])
  14. # 对行和列作切片操作
  15. print(dict_data.iloc[1:3, 1:4])
  16. print(dict_data.loc["张三":"王五", "语文":"历史"])
  17. 代码的运行结果为:
  18. 语文 数学 英语 地理 历史 化学
  19. 张三 70 70 78 82 83 81
  20. 李四 69 64 74 72 76 70
  21. 王五 69 76 69 76 66 83
  22. 赵六 88 88 69 76 60 70
  23. 坤哥 65 74 84 79 60 72
  24. 语文 数学 英语 地理 历史 化学
  25. 李四 69 64 74 72 76 70
  26. 王五 69 76 69 76 66 83
  27. 语文 数学 英语 地理 历史 化学
  28. 张三 70 70 78 82 83 81
  29. 李四 69 64 74 72 76 70
  30. 王五 69 76 69 76 66 83
  31. 赵六 88 88 69 76 60 70
  32. 数学 英语 地理
  33. 张三 70 78 82
  34. 李四 64 74 72
  35. 王五 76 69 76
  36. 赵六 88 69 76
  37. 坤哥 74 84 79
  38. 数学 英语 地理 历史 化学
  39. 张三 70 78 82 83 81
  40. 李四 64 74 72 76 70
  41. 王五 76 69 76 66 83
  42. 赵六 88 69 76 60 70
  43. 坤哥 74 84 79 60 72
  44. 数学 英语 地理
  45. 李四 64 74 72
  46. 王五 76 69 76
  47. 语文 数学 英语 地理 历史
  48. 张三 70 70 78 82 83
  49. 李四 69 64 74 72 76
  50. 王五 69 76 69 76 66
  51. Process finished with exit code 0

3 常用属性和方法汇总

DataFrame 的属性和方法,与 Series 相差无几

名称属性&方法描述
T行和列转置。
axes返回一个仅以行轴标签和列轴标签为成员的列表。
dtypes返回每列数据的数据类型。
emptyDataFrame中没有数据或者任意坐标轴的长度为0,则返回True。
ndim轴的数量,也指数组的维数。
shape返回一个元组,表示了 DataFrame 维度。
sizeDataFrame中的元素数量。
values使用 numpy 数组表示 DataFrame 中的元素值。
head()返回前 n 行数据。
tail()返回后 n 行数据。
shift()将行或列移动指定的步幅长度
  1. dict_data = {
  2. 'Name': pd.Series(['张三', '李四', "王五", '赵六', '坤哥', '凡凡', '峰峰']),
  3. 'age': pd.Series([25, 26, 25, 28, 23, 29, 23]),
  4. 'Height': pd.Series([174.23, 173.24, 173.98, 172.56, 183.20, 174.6, 183.8])
  5. }
  6. # 构建DataFrame
  7. df = pd.DataFrame(dict_data)
  8. # 输出series
  9. print(df)
  10. print("-*-" * 30)
  11. # 输出DataFrame的转置,也就是把行和列进行交换
  12. print(df.T)
  13. print("-*-" * 30)
  14. # 返回一个行标签、列标签组成的列表
  15. print(df.axes)
  16. print("-*-" * 30)
  17. # 输出行、列标签类型
  18. print(df.dtypes)
  19. print("-*-" * 30)
  20. # 判断输入数据是否为空,若为 True 表示对象为空
  21. print("empty:\n", df.empty)
  22. print("-*-" * 30)
  23. # 返回数据对象的维数。DataFrame 是一个二维数据结构
  24. print(df.ndim)
  25. print("-*-" * 30)
  26. # DataFrame的形状
  27. print(df.shape)
  28. print("-*-" * 30)
  29. # DataFrame的中元素个数
  30. print(df.size)
  31. print("-*-" * 30)
  32. # DataFrame的数据
  33. print(df.values)
  34. print("-*-" * 30)
  35. # 获取前3行数据
  36. print(df.head(3))
  37. print("-*-" * 30)
  38. # 获取后2行数据
  39. print(df.tail(2))
  40. 代码的运行结果为:
  41. Name age Height
  42. 0 张三 25 174.23
  43. 1 李四 26 173.24
  44. 2 王五 25 173.98
  45. 3 赵六 28 172.56
  46. 4 坤哥 23 183.20
  47. 5 凡凡 29 174.60
  48. 6 峰峰 23 183.80
  49. -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
  50. 0 1 2 3 4 5 6
  51. Name 张三 李四 王五 赵六 坤哥 凡凡 峰峰
  52. age 25 26 25 28 23 29 23
  53. Height 174.23 173.24 173.98 172.56 183.2 174.6 183.8
  54. -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
  55. [RangeIndex(start=0, stop=7, step=1), Index(['Name', 'age', 'Height'], dtype='object')]
  56. -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
  57. Name object
  58. age int64
  59. Height float64
  60. dtype: object
  61. -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
  62. empty:
  63. False
  64. -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
  65. 2
  66. -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
  67. (7, 3)
  68. -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
  69. 21
  70. -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
  71. [['张三' 25 174.23]
  72. ['李四' 26 173.24]
  73. ['王五' 25 173.98]
  74. ['赵六' 28 172.56]
  75. ['坤哥' 23 183.2]
  76. ['凡凡' 29 174.6]
  77. ['峰峰' 23 183.8]]
  78. -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
  79. Name age Height
  80. 0 张三 25 174.23
  81. 1 李四 26 173.24
  82. 2 王五 25 173.98
  83. -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*-
  84. Name age Height
  85. 5 凡凡 29 174.6
  86. 6 峰峰 23 183.8
  • shift()移动行或列

    如果您想要移动 DataFrame 中的某一行/列,可以使用 shift() 函数实现。它提供了一个periods参数,该参数表示在特定的轴上移动指定的步幅。

DataFrame.shift(periods=1, freq=None, axis=0)
​
# peroids   类型为int,表示移动的幅度,可以是正数,也可以是负数,默认值为1。
# freq  日期偏移量,默认值为None,适用于时间序。取值为符合时间规则的字符串。
# axis  如果是 0 或者 "index" 表示上下移动,如果是 1 或者 "columns" 则会左右移动。
# fill_value    该参数用来填充缺失值。

该函数的返回值是移动后的 DataFrame 副本

  1. df = pd.DataFrame({
  2. 'a_data': [40, 28, 39, 32, 18],
  3. 'b_data': [20, 37, 41, 35, 45],
  4. 'c_data': [22, 17, 11, 25, 15]})
  5. # 移动幅度为3
  6. print(df)
  7. new_df = df.shift(periods=1)
  8. print(new_df)
  9. print(df)
  10. 代码的运行结果为:
  11. a_data b_data c_data
  12. 0 40 20 22
  13. 1 28 37 17
  14. 2 39 41 11
  15. 3 32 35 25
  16. 4 18 45 15
  17. a_data b_data c_data
  18. 0 NaN NaN NaN
  19. 1 40.0 20.0 22.0
  20. 2 28.0 37.0 17.0
  21. 3 39.0 41.0 11.0
  22. 4 32.0 35.0 25.0
  23. a_data b_data c_data
  24. 0 40 20 22
  25. 1 28 37 17
  26. 2 39 41 11
  27. 3 32 35 25
  28. 4 18 45 15
  • 切记这里的shift,返回的是一个副本就类似于python中的深拷贝。shift函数在偏移数据时,并不会使原有的数据消失,而是将其移动到新的位置,并用NaN值填充原来的位置。

使用 fill_value 参数填充 DataFrame 中的缺失值

  1. df = pd.DataFrame({
  2. 'a_data': [40, 28, 39, 32, 18],
  3. 'b_data': [20, 37, 41, 35, 45],
  4. 'c_data': [22, 17, 11, 25, 15]})
  5. # 移动幅度为3
  6. print(df)
  7. new_df = df.shift(periods=3, axis="index", fill_value=100)
  8. print(new_df)
  9. 代码的运行结果为:
  10. a_data b_data c_data
  11. 0 40 20 22
  12. 1 28 37 17
  13. 2 39 41 11
  14. 3 32 35 25
  15. 4 18 45 15
  16. a_data b_data c_data
  17. 0 100 100 100
  18. 1 100 100 100
  19. 2 100 100 100
  20. 3 40 20 22

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/447524
推荐阅读
相关标签
  

闽ICP备14008679号