任务简介:
numpy的表现已经很好了,但是当我们需要处理更灵活的数据任务的时候(如为数据添加标签、 处理缺失值、分组等),numpy 的限制就非常明显了,基于numpy而创建的pandas 库提供了一种高效的带行标签和列标签的数据结构DataFrame,完美地解决了上述问题。
任务说明:
1、掌握DataFrame数据结构的创建和基本性质。
2、掌握Pandas库的数值运算和统计分析方法。
3、掌握DataFrame缺失值处理、数据集合并等操作。
4、掌握DataFrame累计与分组操作。
5、用eval和query实现更高效的计算。
一、引子
Numpy 在向量化的数值计算中表现优异
但是在处理更灵活、复杂的数据任务:
如为数据添加标签、处理缺失值、分组和透视表等方面
Numpy显得力不从心
而基于Numpy构建的Pandas库,提供了使得数据分析变得更快更简单的高级数据结构和操作工具
二、对象创建
1. Pandas Series对象
Series 是带标签数据的一维数组
Series对象的创建:
通用结构: pd.Series(data, index=index, dtype=dtype)
data: 数据,可以是列表,字典或Numpy数组
index: 索引,为可选参数
dtype: 数据类型,为可选参数
- 用列表创建
输入:
import pandas as pd
data = pd.Series([1.5, 3, 4.5, 6])
data
输出:
0 1.5
1 3.0
2 4.5
3 6.0
dtype: float64
输入:
data = pd.Series([1.5, 3, 4.5, 6], index=["a", "b", "c", "d"])
data
输出:
a 1.5
b 3.0
c 4.5
d 6.0
dtype: float64
缺省则从传入的数据自动判断
输入:
data = pd.Series([1, 2, 3, 4], index=["a", "b", "c", "d"])
data
输出:
a 1
b 2
c 3
d 4
dtype: int64
输入:
data = pd.Series([1, 2, 3, 4], index=["a", "b", "c", "d"], dtype="float")
data
输出:
a 1.0
b 2.0
c 3.0
d 4.0
dtype: float64
注意:数据支持多种类型
输入:
data = pd.Series([1, 2, "3", 4], index=["a", "b", "c", "d"])
data
输出:
a 1
b 2
c 3
d 4
dtype: object
输入:
data["a"]
输出:
1
输入:
data["c"]
输出:
'3'
数据类型可被强制改变
输入:
data = pd.Series([1, 2, "3", 4], index=["a", "b", "c", "d"], dtype=float)
data
输出:
a 1.0
b 2.0
c 3.0
d 4.0
dtype: float64
输入:
data["c"]
输出:
3.0
输入:
data = pd.Series([1, 2, "a", 4], index=["a", "b", "c", "d"], dtype=float)
data
输出:
ValueError: could not convert string to float: 'a'
- 用一维numpy数组创建
输入:
import numpy as np
x = np.arange(5)
pd.Series(x)
输出:
0 0
1 1
2 2
3 3
4 4
dtype: int32
- 用字典创建
输入:
population_dict = {"BeiJing": 2154,
"ShangHai": 2424,
"ShenZhen": 1303,
"HangZhou": 981 }
population = pd.Series(population_dict)
population
输出:
BeiJing 2154
ShangHai 2424
ShenZhen 1303
HangZhou 981
dtype: int64
- 字典创建,如果指定index,则会到字典的键中筛选,找不到的,值设为NaN
输入:
population = pd.Series(population_dict, index=["BeiJing", "HangZhou", "c", "d"])
population
输出:
BeiJing 2154.0
HangZhou 981.0
c NaN
d NaN
dtype: float64
- data为标量的情况
输入:
pd.Series(5, index=[100, 200, 300])
输出:
100 5
200 5
300 5
dtype: int64
2. Pandas DataFrame对象
DataFrame 是带标签数据的多维数组
DataFrame对象的创建
通用结构: pd.DataFrame(data, index=index, columns=columns)
data: 数据,可以是列表,字典或Numpy数组
index: 索引,为可选参数
columns: 列标签,为可选参数
- 通过Series对象创建
输入:
population_dict = {"BeiJing": 2154,
"ShangHai": 2424,
"ShenZhen": 1303,
"HangZhou": 981 }
population = pd.Series(population_dict)
pd.DataFrame(population)
输出: 输入:
pd.DataFrame(population, columns=["population"])
输出:
- 通过Series对象字典创建
输入:
GDP_dict = {"BeiJing": 30320,
"ShangHai": 32680,
"ShenZhen": 24222,
"HangZhou": 13468 }
GDP = pd.Series(GDP_dict)
GDP
输出:
BeiJing 30320
ShangHai 32680
ShenZhen 24222
HangZhou 13468
dtype: int64
输入:
pd.DataFrame({"population": population,
"GDP": GDP})
输出: 注意:数量不够的会自动补齐
输入:
pd.DataFrame({"population": population,
"GDP": GDP,
"country": "China"})
输出:
- 通过字典列表对象创建
输入:
import numpy as np
import pandas as pd
data = [{"a": i, "b": 2*i} for i in range(3)]
data
输出:
[{'a': 0, 'b': 0}, {'a': 1, 'b': 2}, {'a': 2, 'b': 4}]
输入:
data = pd.DataFrame(data)
data
输出: 输入:
data1 = data["a"].copy()
data1
输出:
0 0
1 1
2 2
Name: a, dtype: int64
输入:
data1[0] = 10
data1
输出:
0 10
1 1
2 2
Name: a, dtype: int64
输入:
data
输出:
输入:
data = [{"a": 1, "b":1},{"b": 3, "c":4}]
data
输出:
[{'a': 1, 'b': 1}, {'b': 3, 'c': 4}]
输入:
pd.DataFrame(data)
输出:
- 通过Numpy二维数组创建
输入:
data = np.random.randint(10, size=(3, 2))
data
输出:
array([[8, 5],
[1, 5],
[5, 8]])
输入:
pd.DataFrame(data, columns=["foo", "bar"], index=["a", "b", "c"])
输出:
三、DataFrame性质
1. 属性
输入:
data = pd.DataFrame({"pop": population, "GDP": GDP})
data
输出: (1)df.values 返回numpy数组表示的数据
输入:
data.values
输出:
array([[ 2154, 30320],
[ 2424, 32680],
[ 1303, 24222],
[ 981, 13468]], dtype=int64)
(2)df.index 返回行索引
输入:
data.index
输出:
Index(['BeiJing', 'ShangHai', 'ShenZhen', 'HangZhou'], dtype='object')
(3)df.columns 返回列索引
输入:
data.columns
输出:
Index(['pop', 'GDP'], dtype='object')
(4)df.shape 形状
输入:
data.shape
输出:
(4, 2)
(5) pd.size 大小
输入:
data.size
输出:
8
(6)pd.dtypes 返回每列数据类型
输入:
data.dtypes
输出:
pop int64
GDP int64
dtype: object
2. 索引
输入:
data
输出: (1)获取列
输入:
data["pop"]
输出:
BeiJing 2154
ShangHai 2424
ShenZhen 1303
HangZhou 981
Name: pop, dtype: int64
输入:
data[["GDP", "pop"]]
输出:
输入:
data.GDP
输出:
BeiJing 30320
ShangHai 32680
ShenZhen 24222
HangZhou 13468
Name: GDP, dtype: int64
(2)获取行
输入:
data.loc["BeiJing"]
输出:
pop 2154
GDP 30320
Name: BeiJing, dtype: int64
输入:
data.loc[["BeiJing", "HangZhou"]]
输出:
输入:
data
输出: 输入:
data.iloc[0]
输出:
pop 2154
GDP 30320
Name: BeiJing, dtype: int64
输入:
data.iloc[[1, 3]]
输出: (3)获取标量
输入:
data
输出: 输入:
data.loc["BeiJing", "GDP"]
输出:
30320
输入:
data.iloc[0, 1]
输出:
30320
输入:
data.values[0][1]
输出:
30320
(4)Series对象的索引
输入:
type(data.GDP)
输出:
pandas.core.series.Series
输入:
GDP
输出:
BeiJing 30320
ShangHai 32680
ShenZhen 24222
HangZhou 13468
dtype: int64
输入:
GDP["BeiJing"]
输出:
30320
3. 切片
输入:
dates = pd.date_range(start='2019-01-01', periods=6)
dates
输出:
DatetimeIndex(['2021-08-01', '2021-08-02', '2021-08-03', '2021-08-04',
'2021-08-05', '2021-08-06'],
dtype='datetime64[ns]', freq='D')
输入:
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=["A", "B", "C", "D"])
df
输出: (1)行切片
输入:
df["2021-08-01": "2021-08-03"]
输出: 输入:
df.loc["2021-08-01": "2021-08-03"]
输出: 输入:
df.iloc[0: 3]
输出: (2)列切片
输入:
df
输出: 输入:
df.loc[:, "A": "C"]
输出: 输入:
df.iloc[:, 0: 3]
输出: (3)多种多样的取值
输入:
df
输出:
输入:
df.loc["2021-08-02": "2021-08-03", "C":"D"]
输出: 输入:
df.iloc[1: 3, 2:]
输出:
输入:
df.loc["2021-08-04": "2021-08-06", ["A", "C"]]
输出: 输入:
df.iloc[3:, [0, 2]]
输出:
输入:
df.loc[["2021-08-02", "2021-08-06"], "C": "D"]
输出: 输入:
df.iloc[[1, 5], 0: 3]
输出:
输入:
df.loc[["2021-08-04", "2021-08-06"], ["A", "D"]]
输出: 输入:
df.iloc[[1, 5], [0, 3]]
输出:
4. 布尔索引
输入:
df
输出: 输入:
df > 0
输出: 输入:
df[df > 0]
输出:
输入:
df.A > 0
输出:
2021-08-01 True
2021-08-02 True
2021-08-03 False
2021-08-04 True
2021-08-05 True
2021-08-06 False
Freq: D, Name: A, dtype: bool
输入:
df[df.A > 0]
输出:
输入:
df2 = df.copy()
df2['E'] = ['one', 'one', 'two', 'three', 'four', 'three']
df2
输出: 输入:
输出:
输入:
输出:
输入:
输出:
输入:
输出:
输入:
输出:
输入:
输出:
输入:
输出:
输入:
输出:
|