在上一个学习记录中,我们主要介绍了数据表表示、对DataFrame进行操作、读写数据表格以及选择DataFrame的子集。这次介绍的是在pandas中创建绘图、生成新列以及计算统计数据。
参考的是pandas官方文档的入门教程:https://pandas.pydata.org/docs/getting_started/intro_tutorials
数据集来源于kaggle:
https://www.kaggle.com/competitions/house-prices-advanced-regression-techniques/data
在pandas中创建绘图
导入
import pandas as pd
import matplotlib.pyplot as plt
最简单的绘图代码
e.g.
house_information=pd.read_csv("train.csv")
print(house_information.head())
# plt.tight_layout()
house_information.plot()
plt.show()
输出的图表如下:
使用 DataFrame
时,pandas 默认为每一列包含数字数据的创建一个线图。
e.g.
如果我只关心OverallQual与售价的关系:
house_information.plot.scatter(x="OverallQual",y="SalePrice")
plt.show()
使用plot函数绘图时,默认用line
,但也有很多方法可供选择:
'area',
'bar',
'barh',
'box',
'density',
'hexbin',
'hist',
'kde',
'line',
'pie',
'scatter'
这里比较适合用散点查看分布情况,也就是用scatter。
输出如下:
pandas 创建的每个绘图对象都是 Matplotlib 对象。由于 Matplotlib 提供了大量的选项来自定义绘图,因此使 pandas 和 Matplotlib 之间的链接显式化,从而可以将 Matplotlib 的所有功能发挥到绘图上。
更多的绘图功能将在学习Matplotlib时重点学习。
生成新列
从现有的列生成新列
e.g.
train=pd.read_csv("train.csv")
train["Id2"]=train["Id"]*2
print(train.head(10))
输出结果如下:
Id MSSubClass MSZoning LotFrontage ... SaleType SaleCondition SalePrice Id2
0 1 60 RL 65.0 ... WD Normal 208500 2
1 2 20 RL 80.0 ... WD Normal 181500 4
2 3 60 RL 68.0 ... WD Normal 223500 6
3 4 70 RL 60.0 ... WD Abnorml 140000 8
4 5 60 RL 84.0 ... WD Normal 250000 10
5 6 50 RL 85.0 ... WD Normal 143000 12
6 7 20 RL 75.0 ... WD Normal 307000 14
7 8 60 RL NaN ... WD Normal 200000 16
8 9 50 RM 51.0 ... WD Abnorml 129900 18
9 10 190 RL 50.0 ... WD Normal 118000 20
[10 rows x 82 columns]
可以看出,派生的新列是直接添加在表的最后的。并且每一行数据的Id2的值都是Id的值的两倍。
只需要写上[]
并在其中写上新列名称,然后可以批量得出新列的结果,不需要通过循环迭代每一行!
e.g.
同理,也可以创建一个新列,值为SalePrice和OverallQual的比值。
train["SalePrice_OverallQual"]=train["SalePrice"]/train["OverallQual"]
print(train.head(10))
输出结果如下:
Id MSSubClass MSZoning ... SalePrice Id2 SalePrice_OverallQual
0 1 60 RL ... 208500 2 29785.714286
1 2 20 RL ... 181500 4 30250.000000
2 3 60 RL ... 223500 6 31928.571429
3 4 70 RL ... 140000 8 20000.000000
4 5 60 RL ... 250000 10 31250.000000
5 6 50 RL ... 143000 12 28600.000000
6 7 20 RL ... 307000 14 38375.000000
7 8 60 RL ... 200000 16 28571.428571
8 9 50 RM ... 129900 18 18557.142857
9 10 190 RL ... 118000 20 23600.000000
如果需要使用比较复杂的函数生成一个新的列,可以通过 apply()
使用任意 Python 代码。
apply的使用详见:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.apply.html#
改变现有的列的名称
e.g.
train=train.rename(columns={"Id":"a",
"MSSubClass":"b",
"MSZoning":"c",})
print(train.head(10))
rename()
函数可用于行标签和列标签。提供一个字典,其中包含当前名称的键和新名称的值,以更新相应的名称。
输出结果如下:
a b c LotFrontage ... SaleCondition SalePrice Id2 SalePrice_OverallQual
0 1 60 RL 65.0 ... Normal 208500 2 29785.714286
1 2 20 RL 80.0 ... Normal 181500 4 30250.000000
2 3 60 RL 68.0 ... Normal 223500 6 31928.571429
3 4 70 RL 60.0 ... Abnorml 140000 8 20000.000000
4 5 60 RL 84.0 ... Normal 250000 10 31250.000000
5 6 50 RL 85.0 ... Normal 143000 12 28600.000000
6 7 20 RL 75.0 ... Normal 307000 14 38375.000000
7 8 60 RL NaN ... Normal 200000 16 28571.428571
8 9 50 RM 51.0 ... Abnorml 129900 18 18557.142857
9 10 190 RL 50.0 ... Normal 118000 20 23600.000000
[10 rows x 83 columns]
计算统计数据
对单个列
e.g.
train=pd.read_csv("train.csv")
SalePrice_median=train["SalePrice"].median()//计算中位数
SalePrice_mean=train["SalePrice"].mean()//计算平均数
SalePrice_describe=train["SalePrice"].describe()
print(SalePrice_median)
print(SalePrice_mean)
print(SalePrice_describe)
3个print对应的输出结果如下:
163000.0
180921.19589041095
count 1460.000000
mean 180921.195890
std 79442.502883
min 34900.000000
25% 129975.000000
50% 163000.000000
75% 214000.000000
max 755000.000000
Name: SalePrice, dtype: float64
对多个列
e.g.
median=train[["SalePrice","OverallQual"]].median()
mean=train[["SalePrice","OverallQual"]].mean()
describe=train[["SalePrice","OverallQual"]].describe()
print(median)
print(mean)
print(describe)
3个print对应的输出结果如下:
SalePrice 163000.0
OverallQual 6.0
dtype: float64
SalePrice 180921.195890
OverallQual 6.099315
dtype: float64
SalePrice OverallQual
count 1460.000000 1460.000000
mean 180921.195890 6.099315
std 79442.502883 1.382997
min 34900.000000 1.000000
25% 129975.000000 5.000000
50% 163000.000000 6.000000
75% 214000.000000 7.000000
max 755000.000000 10.000000
另一种分组方式
e.g.
输出不同OverallQual下SalePrice的平均值:
SalePrice_mean_group_by_OverallQual=train[["SalePrice","OverallQual"]].groupby("OverallQual").mean()
print(SalePrice_mean_group_by_OverallQual)
输出结果如下:
SalePrice
OverallQual
1 50150.000000
2 51770.333333
3 87473.750000
4 108420.655172
5 133523.347607
6 161603.034759
7 207716.423197
8 274735.535714
9 367513.023256
10 438588.388889
我们感兴趣的是每个OverallQual的平均SalePrice,因此首先选择这两列(注意有双层中括号,里边是一个列表): train[["SalePrice","OverallQual"]]
。接下来,将 groupby()
方法应用于OverallQual列,为OverallQual的每个类别创建一个组。计算并返回每个OverallQual的平均SalePrice。
这里明确选择了两列,分别是OverallQual和SalePrice,也可以选择更多列。
e.g.
也可以直接省略,此时是选择整个表:
mean_group_by_OverallQual=train.groupby("OverallQual").mean()
print(mean_group_by_OverallQual)
输出结果如下:
Id MSSubClass ... YrSold SalePrice
OverallQual ...
1 455.000000 25.000000 ... 2008.000000 50150.000000
2 885.000000 26.666667 ... 2008.000000 51770.333333
3 819.550000 50.000000 ... 2008.000000 87473.750000
4 758.422414 58.750000 ... 2007.982759 108420.655172
5 736.322418 48.778338 ... 2007.775819 133523.347607
6 728.037433 64.104278 ... 2007.855615 161603.034759
7 719.451411 61.598746 ... 2007.786834 207716.423197
8 727.958333 55.267857 ... 2007.708333 274735.535714
9 661.534884 46.976744 ... 2007.976744 367513.023256
10 763.500000 46.111111 ... 2007.666667 438588.388889
计算每个类别的记录数
e.g.
OverallQual_counts=train["OverallQual"].value_counts()
print(OverallQual_counts)
输出结果如下:
5 397
6 374
7 319
8 168
4 116
9 43
3 20
10 18
2 3
1 2
Name: OverallQual, dtype: int64
这里统计的是每个OverallQual的记录数。