1.3 创建DataFrame
- pd.DataFrame(data, index, columns)
(1)data:数据,格式包含列表、字典或Series的字典、二维ndarray、 Series对象、另一个DataFrame
(2)index:索引,默认采用整型整数作为index
(3)columns:列名
1.3.1 从字典创建
# 1.创建一个字典
d = {"one": [1,2,3,5],"two":[4,5,9,1]}
# 2.使用dataframe格式
df = pd.DataFrame(d)
# 3.查看数据
df
# 4.得到的数据为
one two
0 1 4
1 2 5
2 3 9
3 5 1
1.3.2从Series创建
-
可从一个Series对象直接创建一个DataFrame
# 1.通过切片操作来读取iris.csv文件中的Petal.Length列的前5行数据
ts = data["Petal.Length"].head(5)
# 2.查看数据的结构
print(type(ts))
# 3.查看结果
ts
# 4.得到的结果为
<class 'pandas.core.series.Series'>
0 1.4
1 1.4
2 1.3
3 1.5
4 1.4
Name: Petal.Length, dtype: float64
# 5.将其转变成dataframe格式
df = pd.DataFrame(ts)
# 6.查看数据的结构
print(type(df))
# 7.查看结果
df
# 8.得到的结果为
<class 'pandas.core.frame.DataFrame'>
Petal.Length
0 1.4
1 1.4
2 1.3
3 1.5
4 1.4
1.3.3 DataFrame的常见操作
-
(1)查看前n行数据与最后n行数据
# 1.查看前n行数据
data.head(5)
# 2.得到的结果为
Unnamed: 0 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
0 1 5.1 3.5 1.4 0.2 setosa
1 2 4.9 3.0 1.4 0.2 setosa
2 3 4.7 3.2 1.3 0.2 setosa
3 4 4.6 3.1 1.5 0.2 setosa
4 5 5.0 3.6 1.4 0.2 setosa
# 3.查看最后n行数据
data.tail(5)
# 4.得到的结果为
Unnamed: 0 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
145 146 6.7 3.0 5.2 2.3 virginica
146 147 6.3 2.5 5.0 1.9 virginica
147 148 6.5 3.0 5.2 2.0 virginica
148 149 6.2 3.4 5.4 2.3 virginica
149 150 5.9 3.0 5.1 1.8 virginica
-
(2)查看DataFrame的形状,即行数和列数
# 1.查看DataFrame的形状,即行数和列数
data.shape
# 2.得到的结果为
(150, 6)
-
(3) 查看索引、数据类型和内存占用信息
# 1.查看索引、数据类型和内存占用信息
data.info()
# 2.得到的结果为
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 6 columns):
Unnamed: 0 150 non-null int64
Sepal.Length 150 non-null float64
Sepal.Width 150 non-null float64
Petal.Length 150 non-null float64
Petal.Width 150 non-null float64
Species 150 non-null object
dtypes: float64(4), int64(1), object(1)
memory usage: 7.2+ KB
-
(4)查看数值列的汇总信息
# 1.查看数值列的汇总信息
data.describe()
# 2.得到的结果为
Unnamed: 0 Sepal.Length Sepal.Width Petal.Length Petal.Width
count 150.000000 150.000000 150.000000 150.000000 150.000000
mean 75.500000 5.843333 3.057333 3.758000 1.199333
std 43.445368 0.828066 0.435866 1.765298 0.762238
min 1.000000 4.300000 2.000000 1.000000 0.100000
25% 38.250000 5.100000 2.800000 1.600000 0.300000
50% 75.500000 5.800000 3.000000 4.350000 1.300000
75% 112.750000 6.400000 3.300000 5.100000 1.800000
max 150.000000 7.900000 4.400000 6.900000 2.500000
-
(5)数据筛选
# 1.数据筛选:选取Petal.Length中的小于1.3的值
data[data["Petal.Length"] < 1.3]
# 2.得到的结果为
Unnamed: 0 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
13 14 4.3 3.0 1.1 0.1 setosa
14 15 5.8 4.0 1.2 0.2 setosa
22 23 4.6 3.6 1.0 0.2 setosa
35 36 5.0 3.2 1.2 0.2 setosa
-
(6)增加列
# 1.创建一个字典
d = {"setosa":1,"versicolor":2,"virginica":3}
# 2.# map接收字典d,然后根据"Species"的值来确定label的值
data["label"] = data["Species"].map(d)
# 3.查看结果
print(data)
# 4.得到的结果为
Unnamed: 0 Sepal.Length Sepal.Width Petal.Length Petal.Width \
0 1 5.1 3.5 1.4 0.2
1 2 4.9 3.0 1.4 0.2
2 3 4.7 3.2 1.3 0.2
3 4 4.6 3.1 1.5 0.2
4 5 5.0 3.6 1.4 0.2
.. ... ... ... ... ...
145 146 6.7 3.0 5.2 2.3
146 147 6.3 2.5 5.0 1.9
147 148 6.5 3.0 5.2 2.0
148 149 6.2 3.4 5.4 2.3
149 150 5.9 3.0 5.1 1.8
Species label
0 setosa 1
1 setosa 1
2 setosa 1
3 setosa 1
4 setosa 1
.. ... ...
145 virginica 3
146 virginica 3
147 virginica 3
148 virginica 3
149 virginica 3
[150 rows x 7 columns]
- (7)删除列
# 1.删除Species列
del data["Species"]
# 2.查看前两行数据
data.head(2)
# 3.得到的结果为
Unnamed: 0 Sepal.Length Sepal.Width Petal.Length Petal.Width label
0 1 5.1 3.5 1.4 0.2 1
1 2 4.9 3.0 1.4 0.2 1
- (8)修改列名
# 1. 把原来的列名与最终想要的列名形成字典
d = {"Sepal.Length":"a","Sepal.Width":"b"}
# 2.修改列名
data.rename(columns=d).head(2)
# 3.得到的结果为
Unnamed: 0 a b Petal.Length Petal.Width label
0 1 5.1 3.5 1.4 0.2 1
1 2 4.9 3.0 1.4 0.2 1
2.数据探索与统计
2.1 汇总统计
- 相关的汇总统计方法有如下这些:count、describe、min、max、cumsum、cumprod、sum、mean、median、var、std、idmin、idmax、diff、skew、kurt
- 这里以describe()方法为例子
- describe()方法默认返回以下信息
count | 非空值的数量 |
mean | 平均值 |
std | 标准差 |
min | 最小值 |
max | 最大值 |
25% | 四分之一分位数 |
50% | 二分之一分位数 |
75% | 四分之三分位数 |
# 1. 汇总统计:describe()方法
data = pd.read_csv(r"C:/XXX/xxx/Documents/mycrawlers/数据分析与可视化/实验二——Pandas的基本使用方法/iris.csv")
# 2.查看数据
data.describe()
# 3.得到的结果为
Unnamed: 0 Sepal.Length Sepal.Width Petal.Length Petal.Width
count 150.000000 150.000000 150.000000 150.000000 150.000000
mean 75.500000 5.843333 3.057333 3.758000 1.199333
std 43.445368 0.828066 0.435866 1.765298 0.762238
min 1.000000 4.300000 2.000000 1.000000 0.100000
25% 38.250000 5.100000 2.800000 1.600000 0.300000
50% 75.500000 5.800000 3.000000 4.350000 1.300000
75% 112.750000 6.400000 3.300000 5.100000 1.800000
max 150.000000 7.900000 4.400000 6.900000 2.500000
2.2 变量之间的相关性
2.2.1 COV方法——计算协方差
- numpy.cov(m, y=None, rowvar=True, bias=False, ddof=None, fweights=None, aweights=None)
m | 一个一维或二维的变量。 变量为列 |
y | 它与m的形式相同 |
rowvar | 如果rowvar为True(默认),那么每一行代表一个变量,列中有观测值。否则,关系被转置 |
bias | 默认的归一化是假的。如果bias是True,它将对数据点进行标准化处理 |
ddof | 如果不是无,则会覆盖bias所暗示的默认值。请注意,ddof=1将返回无偏估计,即使同时指定了fweights和aweights |
fweights | 是整数频率权重的一维数组 |
aweights | 是观察向量权重的一维数组 |
# 1.计算的是DataFrame列与列的协方差
data.cov()
# 2.得到的结果为
Unnamed: 0 Sepal.Length Sepal.Width Petal.Length Petal.Width
Unnamed: 0 1887.500000 25.782886 -7.618121 67.692953 29.805034
Sepal.Length 25.782886 0.685694 -0.042434 1.274315 0.516271
Sepal.Width -7.618121 -0.042434 0.189979 -0.329656 -0.121639
Petal.Length 67.692953 1.274315 -0.329656 3.116278 1.295609
Petal.Width 29.805034 0.516271 -0.121639 1.295609 0.581006
# 3.指定两列计算其协方差
print(data["Sepal.Length"].cov(data["Petal.Length"]))
# 4.得到的结果为
1.2743154362416107
2.2.2CORR方法——计算相关系数
- dataframe.corr(method='pearson', min_periods=1)
method | 可选值为{‘pearson’, ‘kendall’, ‘spearman’} |
|
min_periods | 样本最少的数据量 |
# 1.算变量之间的相关系数
data.corr()
# 2.得到的结果为
Unnamed: 0 Sepal.Length Sepal.Width Petal.Length Petal.Width
Unnamed: 0 1.000000 0.716676 -0.402301 0.882637 0.900027
Sepal.Length 0.716676 1.000000 -0.117570 0.871754 0.817941
Sepal.Width -0.402301 -0.117570 1.000000 -0.428440 -0.366126
Petal.Length 0.882637 0.871754 -0.428440 1.000000 0.962865
Petal.Width 0.900027 0.817941 -0.366126 0.962865 1.000000
# 3.计算某两列的相关性
print(data["Sepal.Length"].corr(data["Petal.Length"]))
# 4.得到的结果为
0.8717537758865831
3. 数据合并和规整
3.1 数据排序
3.1.1 按索引降序排列,并输出其前5行数据
# 1.导入数据
data = pd.read_csv(r"C:/XXX/xxx/Documents/mycrawlers/数据分析与可视化/实验二——Pandas的基本使用方法/iris.csv")
# 2.按索引降序排序,并输出其前5行数据
data.sort_index(ascending=False).head(5)
# 3.得到的结果为
Unnamed: 0 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
149 150 5.9 3.0 5.1 1.8 virginica
148 149 6.2 3.4 5.4 2.3 virginica
147 148 6.5 3.0 5.2 2.0 virginica
146 147 6.3 2.5 5.0 1.9 virginica
145 146 6.7 3.0 5.2 2.3 virginica
3.1.2 按sepal_width列降序排序
# 1.按sepal_width列降序排序
data.sort_values("Sepal.Width", ascending=False).head(5)
# 2.得到的结果为
Unnamed: 0 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
15 16 5.7 4.4 1.5 0.4 setosa
33 34 5.5 4.2 1.4 0.2 setosa
32 33 5.2 4.1 1.5 0.1 setosa
14 15 5.8 4.0 1.2 0.2 setosa
16 17 5.4 3.9 1.3 0.4 setosa
3.1.3Sample函数—— 随机重排(随机抽样)
有时候我们只需要数据集中的一部分,并不需要全部的数据。这个时候我们就要对数据集进行随机的抽样。pandas中自带有抽样的方法。
-
dataframe.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)
n | 要抽取的行数 df.sample(n=3,random_state=1),提取3行数据列表注意,使random_state,以确保可重复性的例子。 |
frac | 抽取行的比例 例如frac=0.8,就是抽取其中80%。df.sample(frac=0.8, replace=True, random_state=1) |
replace | 是否为有放回抽样,True:有放回抽样,False:未放回抽样 True:取行数据后,可以重复放回后再取,False:取行数据后不放回,下次取其它行数据 注意:当N>总数据容量,replace设置为值时有效 |
weights | 字符索引或概率数组 axis=0:为行字符索引或概率数组,axis=1:为列字符索引或概率数组 |
random_state | int: 随机数发生器种子 random_state=None,取得数据不重复或numpy.random.RandomState,random_state=1,可以取得重复数据 |
axis | 选择抽取数据的行还是列,也就是说axis=1时,在列中随机抽取n列,在axis=0时,在行中随机抽取n行。axis=0:抽取行,axis=1:抽取列 |
# 1.随机重排
data.sample(len(data)).head(5)
# 2.得到的结果为
Unnamed: 0 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
146 147 6.3 2.5 5.0 1.9 virginica
64 65 5.6 2.9 3.6 1.3 versicolor
70 71 5.9 3.2 4.8 1.8 versicolor
76 77 6.8 2.8 4.8 1.4 versicolor
50 51 7.0 3.2 4.7 1.4 versicolor
4.Groupby函数——数据分组与聚合
- df.groupby(by=None, axis=0, level=None, as_index=False, sort=True, group_keys=True, squeeze=False, observed=False)
by | 指定要进行分组的列名,可以是一个列名或者多个列名的列表 |
axis | 用于指定分组方向,0表示行方向,1表示列方向 |
level | 用于指定分组级别 |
as_index | 用于指定分组后的结果是否作为DataFrame的索引 |
sort | 用于指定分组结果是否按照分组列进行排序 |
group_keys | 用于指定分组后是否保留分组键 |
squeeze | 用于指定是否移除单元素的分组 |
observed | 用于指定是否观察数据的层次结构 |
- 先导入数据
# 1.导入数据
tips = pd.read_csv(r"C:/XXX/xxx/Documents/mycrawlers/数据分析与可视化/实验二——Pandas的基本使用方法/tips1.csv")
# 2.读取其前3行数据
tips.head(3)
# 3.得到的结果为
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
4.1 按照性别分组
# 1.按照性别进行分组
grouped = tips.groupby("sex")["tip"]
# 2.分组后求其算术平均值
grouped.mean()
# 3.得到的结果为
sex
Female 2.833448
Male 3.089618
Name: tip, dtype: float64
4.2 同时按照性别和时间分组
# 1.同时按照性别和时间进行分组
grouped = tips.groupby(["sex","time"])["tip"]
# 2.unstack() 这是一个根据索引行列转换的函数
grouped.mean().unstack()
# 3.得到的结果为
time Dinner Lunch
sex
Female 3.002115 2.582857
Male 3.144839 2.882121
4.3 同时计算多个聚合函数
# 1.同时计算多个聚合函数
grouped = tips.groupby("sex")["tip"]
# 2.求其算术平均值、最大值和最小值
grouped.agg([np.mean,np.max,np.min])
# 3.得到的结果为
mean amax amin
sex
Female 2.833448 6.5 1.0
Male 3.089618 10.0 1.0
注意:本文中数据以及内容若有侵权,请第一时间联系删除。
本文是作者个人学习后的总结,未经作者授权,禁止转载,谢谢配合。