pandas零基础入门学习记录(2)

在上一个学习记录中,我们主要介绍了数据表表示、对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的记录数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值