python数据分析之pandas超详细学习笔记(上)

简介: 简介:pandas,python+data+analysis的组合缩写,是python中基于numpy和matplotlib的第三方数据分析库,与后两者共同构成了python数据分析的基础工具包,享有数分三剑客之名。

前言

  • pandas,python+data+analysis的组合缩写,是python中基于numpy和matplotlib的第三方数据分析库,与后两者共同构成了python数据分析的基础工具包,享有数分三剑客之名。

文章开始前,需要进行库的安装:

打开cmd,依次输入以下三个命令即可。

pip install pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

这里使用的是清华源,提高安装速度。


一、series


series是一个一维数组,线性的数据结构。

1、创建一个series数据(默认索引值)

  • 使用pandas.Series()函数
import pandas as pd
# 创建一个series数据,默认索引值
s1 = pd.Series([1, 3, 14, 521])
print(s1)

输出:

0      1
1      3
2     14
3    521
dtype: int64

提示:命名文件的时候文件命不要以pandas命名。

2、创建一个series数据(自定义默认值)

import pandas as pd
# 创建一个series数据,索引值自定义
s2 = pd.Series([1, 3, 14, 521], index=['第一个数', '第二个数', '第三个数', '第四个数'])
print(s2)

输出:

第一个数      1
第二个数      3
第三个数     14
第四个数    521
dtype: int64

3、获取series的数据值

  • 使用pandas.values()函数
import pandas as pd
# 提取series的数据的值
s3 = pd.Series([1, 3, 14, 521])
# 直接获取值
print(s3.values)
print('-------分割线-------')
# 根据索引获取值
print(s3[0:3])

输出:

[  1   3  14 521]
-------分割线-------
0     1
1     3
2    14
dtype: int64

4、用字典来构建一个series数据

series可以看作一个定长的有序字典

import pandas as pd
dict = {"数学": 130, "专业课": 140, "政治": 80, "英语": 70}
s4 = pd.Series(dict)
print(s4)

输出:

数学     130
专业课    140
政治      80
英语      70
dtype: int64


二、DataFrame


1、创建一个DataFrame数据

  • 使用pandas.DataFrame函数

①:

import pandas as pd
data = {
    'class': [1, 2, 3, 4],
    'people': [16, 15, 17, 18]
}
df1 = pd.DataFrame(data)
print(df1)

输出:

   class  people
0      1      16
1      2      15
2      3      17
3      4      18

②:利用np.arange()函数,用法可参考np.arange()用法

import pandas as pd
import numpy as np
df2 = pd.DataFrame(np.arange(8).reshape(2, 4))
print(df2)

输出:

   0  1  2  3
0  0  1  2  3
1  4  5  6  7

2、自定义行和列的值

import pandas as pd
import numpy as np
df3 = pd.DataFrame(np.arange(8).reshape(2, 4), index=['a', 'b'], columns=['11', '22', '33', '44'])
print(df3)

输出:

   11  22  33  44
a   0   1   2   3
b   4   5   6   7

3、获取值、行索引、列索引、转置

  • 使用valuesindexcolumnsaxesT
import pandas as pd
import numpy as np
df4 = pd.DataFrame(np.arange(8).reshape(2, 4), index=['a', 'b'], columns=['11', '22', '33', '44'])
print('--------原数据-------')
print(df4)
print('-------获取值--------')
print(df4.values)
print('-------获取行索引--------')
print(df4.index)
print('-------获取列索引--------')
print(df4.columns)
print('-------获取行及列的索引值--------')
print(df4.axes)
print('-------获取转置-------')
print(df4.T)

输出:

--------原数据-------
   11  22  33  44
a   0   1   2   3
b   4   5   6   7
-------获取值--------
[[0 1 2 3]
 [4 5 6 7]]
-------获取行索引--------
Index(['a', 'b'], dtype='object')
-------获取列索引--------
Index(['11', '22', '33', '44'], dtype='object')
-------获取行及列的索引值--------
[Index(['a', 'b'], dtype='object'), Index(['11', '22', '33', '44'], dtype='object')]
-------获取转置值-------
    a  b
11  0  4
22  1  5
33  2  6
44  3  7

4、获取统计变量

  • 使用pandas.describe()函数
import pandas as pd
data = {'year': [2018, 2019, 2020, 2021],
        'income': [10000, 20000, 30000, 40000],
        'pay': [5000, 15000, 20000, 30000]
}
df5 = pd.DataFrame(data)
print(df5.describe())

输出:

              year        income           pay
count     4.000000      4.000000      4.000000
mean   2019.500000  25000.000000  17500.000000
std       1.290994  12909.944487  10408.329997
min    2018.000000  10000.000000   5000.000000
25%    2018.750000  17500.000000  12500.000000
50%    2019.500000  25000.000000  17500.000000
75%    2020.250000  32500.000000  22500.000000
max    2021.000000  40000.000000  30000.000000

注解:

   count:数量统计,此列共有多少有效值
   mean:均值
   std:标准差
   min:最小值
   25%:四分之一分位数
   50%:二分之一分位数
   75%:四分之三分位数
   max:最大值

5、根据行、列、值进行排序

  • 使用sort_index()sort_values()
import pandas as pd
import numpy as np
df6 = pd.DataFrame(np.arange(8).reshape(2, 4), index=['b', 'a'], columns=['22', '11', '44', '33'])
print('--------原数据-------')
print(df6)
print('--------行排序-------')
print(df6.sort_index(axis=0))
print('--------列排序-------')
print(df6.sort_index(axis=1))
print('--------值排序(对33列里的值进行排序)-------')
print(df6.sort_values(by='33'))

输出:

--------原数据-------
   22  11  44  33
b   0   1   2   3
a   4   5   6   7
--------行排序-------
   22  11  44  33
a   4   5   6   7
b   0   1   2   3
--------列排序-------
   11  22  33  44
b   1   0   3   2
a   5   4   7   6
--------值排序(对33列里的值进行排序)-------
   22  11  44  33
b   0   1   2   3
a   4   5   6   7


三、pandas选择数据


import pandas as pd
import numpy as np
dates = pd.date_range('20210301', periods=6)
df1 = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
print(df1)

输出:

             A   B   C   D
2021-03-01   0   1   2   3
2021-03-02   4   5   6   7
2021-03-03   8   9  10  11
2021-03-04  12  13  14  15
2021-03-05  16  17  18  19
2021-03-06  20  21  22  23
  • 注:以下所有操作均以上述结果为基础

1、获取一列的series数据和行数据

print('----将DataFrame的一个列获取为一个series数据----')
a = df1.A  # 或者写成 df1['A']
print(a)
print('-------获取前两行数据------')
print(df1[0:2])

输出:

----将DataFrame的一个列获取为一个series数据----
2021-03-01     0
2021-03-02     4
2021-03-03     8
2021-03-04    12
2021-03-05    16
2021-03-06    20
Freq: D, Name: A, dtype: int32
-------获取前两行数据------
            A  B  C  D
2021-03-01  0  1  2  3
2021-03-02  4  5  6  7

2、通过标签获取数据

  • 使用loc
print('------行标签-----')
print(df1.loc['20210302'])
print('------行和列混合标签--------')
print(df1.loc['20210301', ['A', 'C']])
print('-------全选行但不全选列-------')
print(df1.loc[:, ['A', 'C']])
print('-------全选列但不全选行-------')
print(df1.loc[['20210302', '20210304'], :])

输出:

------行标签-----
A    4
B    5
C    6
D    7
Name: 2021-03-02 00:00:00, dtype: int32
------行和列混合标签--------
A    0
C    2
Name: 2021-03-01 00:00:00, dtype: int32
-------全选行但不全选列-------
             A   C
2021-03-01   0   2
2021-03-02   4   6
2021-03-03   8  10
2021-03-04  12  14
2021-03-05  16  18
2021-03-06  20  22
-------全选列但不全选行-------
             A   B   C   D
2021-03-02   4   5   6   7
2021-03-04  12  13  14  15

3、通过位置获取数据

  • 使用iloc
print('-------第四行------')
print(df1.iloc[3])
print('-------二到三行,三到四列------')
print(df1.iloc[1:3, 2:4])
print('-------第2,3,4行,3、4列')
print(df1.iloc[[1, 2, 3], [2, 3]])

输出:

-------第四行------
A    12
B    13
C    14
D    15
Name: 2021-03-04 00:00:00, dtype: int32
-------二到三行,三到四列------
             C   D
2021-03-02   6   7
2021-03-03  10  11
-------第2,3,4行,3、4列
             C   D
2021-03-02   6   7
2021-03-03  10  11
2021-03-04  14  15

4、对某一列的数据进行判断

print(df1.A)
print('---------------------分割线--------------------')
print(df1.A > 6)

输出:

2021-03-01     0
2021-03-02     4
2021-03-03     8
2021-03-04    12
2021-03-05    16
2021-03-06    20
Freq: D, Name: A, dtype: int32
---------------------分割线--------------------
2021-03-01    False
2021-03-02    False
2021-03-03     True
2021-03-04     True
2021-03-05     True
2021-03-06     True
Freq: D, Name: A, dtype: bool


四、pandas赋值及操作


import pandas as pd
import numpy as np
dates = pd.date_range('20210301', periods=6)
df1 = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
print(df1)

输出:

             A   B   C   D
2021-03-01   0   1   2   3
2021-03-02   4   5   6   7
2021-03-03   8   9  10  11
2021-03-04  12  13  14  15
2021-03-05  16  17  18  19
2021-03-06  20  21  22  23
  • 以下结果均为上述为基础

1、替换原有值

①根据位置替换数据

df1.iloc[1, 2] = 100
print(df1)

输出:

             A   B    C   D
2021-03-01   0   1    2   3
2021-03-02   4   5  100   7
2021-03-03   8   9   10  11
2021-03-04  12  13   14  15
2021-03-05  16  17   18  19
2021-03-06  20  21   22  23

②根据标签替换数据

df1.loc["20210304", 'B'] = 200
print(df1)

输出:

             A    B   C   D
2021-03-01   0    1   2   3
2021-03-02   4    5   6   7
2021-03-03   8    9  10  11
2021-03-04  12  200  14  15
2021-03-05  16   17  18  19
2021-03-06  20   21  22  23

③根据条件替换数据

Ⅰ.

df1[df1.D > 10] = 0  # df1.D > 10的作用是找到D列数据大于10的所有行数据
print(df1)

输出:

            A  B  C  D
2021-03-01  0  1  2  3
2021-03-02  4  5  6  7
2021-03-03  0  0  0  0
2021-03-04  0  0  0  0
2021-03-05  0  0  0  0
2021-03-06  0  0  0  0

Ⅱ.

df1.A[df1.A == 8] = 300  # 找到A列等于8的所有数据,并替换成300
print(df1)

输出:

              A   B   C   D
2021-03-01    0   1   2   3
2021-03-02    4   5   6   7
2021-03-03  300   9  10  11
2021-03-04   12  13  14  15
2021-03-05   16  17  18  19
2021-03-06   20  21  22  23

2、插入行、列

①通过series数据的形式插入

df1['F'] = pd.Series(['1', '2', '3', '4', '5', '6'], index=dates)
print(df1)

输出:

             A   B   C   D  F
2021-03-01   0   1   2   3  1
2021-03-02   4   5   6   7  2
2021-03-03   8   9  10  11  3
2021-03-04  12  13  14  15  4
2021-03-05  16  17  18  19  5
2021-03-06  20  21  22  23  6

②通过append函数插入(行操作)

s = pd.Series([1, 2, 3, 4], index=['A', 'B', 'C', 'D'])
s.name = 'new'
df2 = df1.append(s)
print(df2)

输出:

                      A   B   C   D
2021-03-01 00:00:00   0   1   2   3
2021-03-02 00:00:00   4   5   6   7
2021-03-03 00:00:00   8   9  10  11
2021-03-04 00:00:00  12  13  14  15
2021-03-05 00:00:00  16  17  18  19
2021-03-06 00:00:00  20  21  22  23
new                   1   2   3   4

③通过insert函数插入(列操作)

df1.insert(2, 'E', [1, 2, 3, 4, 5, 6])  # 在第二列的右边插入一个新的E列
print(df1)

输出:

             A   B  E   C   D
2021-03-01   0   1  1   2   3
2021-03-02   4   5  2   6   7
2021-03-03   8   9  3  10  11
2021-03-04  12  13  4  14  15
2021-03-05  16  17  5  18  19
2021-03-06  20  21  6  22  23

3、删除行、列

①删除行

df2 = df1.drop(dates[1], axis=0)
print(df2)

输出:

             A   B   C   D
2021-03-01   0   1   2   3
2021-03-03   8   9  10  11
2021-03-04  12  13  14  15
2021-03-05  16  17  18  19
2021-03-06  20  21  22  23

我同时也试了另外一个例子,是可以运行的,请看:

import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.arange(24).reshape((6, 4)), index=['1', '2', '3', '4', '5', '6'], columns=['A', 'B', 'C', 'D'])
df2 = df1.drop('2', axis=0)  # 删除‘2’行
print('--------------原数据--------------')
print(df1)
print('--------------删除后的数据-------------')
print(df2)

输出:

--------------原数据--------------
    A   B   C   D
1   0   1   2   3
2   4   5   6   7
3   8   9  10  11
4  12  13  14  15
5  16  17  18  19
6  20  21  22  23
--------------删除后的数据-------------
    A   B   C   D
1   0   1   2   3
3   8   9  10  11
4  12  13  14  15
5  16  17  18  19
6  20  21  22  23

这里是成功把‘2’这行给删除掉了。

②删除列

df2 = df1.drop('A', axis=1)  # 删除A列
print(df2)

输出:

             B   C   D
2021-03-01   1   2   3
2021-03-02   5   6   7
2021-03-03   9  10  11
2021-03-04  13  14  15
2021-03-05  17  18  19
2021-03-06  21  22  23


五、pandas对于空数据的处理


import pandas as pd
import numpy as np
dates = pd.date_range('20210301', periods=6)
df1 = pd.DataFrame(np.arange(24).reshape((6, 4)), index=dates, columns=['A', 'B', 'C', 'D'])
df2 = pd.DataFrame(df1, index=dates, columns=['A', 'B', 'C', 'D', 'E', 'F'])
s1 = pd.Series([3, 4, 6, 7], index=dates[:4])  # 对第一个到第四个数据进行赋值
s2 = pd.Series([32, 5, 2, 1], index=dates[2:])  # 对第三个数据到最后一个数据进行赋值
df2['E'] = s1
df2['F'] = s2
print(df2)

输出:

             A   B   C   D    E     F
2021-03-01   0   1   2   3  3.0   NaN
2021-03-02   4   5   6   7  4.0   NaN
2021-03-03   8   9  10  11  6.0  32.0
2021-03-04  12  13  14  15  7.0   5.0
2021-03-05  16  17  18  19  NaN   2.0
2021-03-06  20  21  22  23  NaN   1.0
  • 以下结果均为上述为基础

1、删除空值所在的行或者列

  • 使用dropna函数
# axis中的0代表行,1代表列。how中的any表示,含有空值即删除 ,all代表全部为空值才删除
print(df2.dropna(axis=0, how='any'))

输出:

             A   B   C   D    E     F
2021-03-03   8   9  10  11  6.0  32.0
2021-03-04  12  13  14  15  7.0   5.0

2、对空值进行赋值

  • 使用fillna函数
# 对空值进行赋值,此处赋值为100
print(df2.fillna(value=100))

输出:

             A   B   C   D      E      F
2021-03-01   0   1   2   3    3.0  100.0
2021-03-02   4   5   6   7    4.0  100.0
2021-03-03   8   9  10  11    6.0   32.0
2021-03-04  12  13  14  15    7.0    5.0
2021-03-05  16  17  18  19  100.0    2.0
2021-03-06  20  21  22  23  100.0    1.0

3、判断数据是否为空值

  • 使用isnull函数,空值返回True,非空值返回Flase
print(df2.isnull())

输出:

                A      B      C      D      E      F
2021-03-01  False  False  False  False  False   True
2021-03-02  False  False  False  False  False   True
2021-03-03  False  False  False  False  False  False
2021-03-04  False  False  False  False  False  False
2021-03-05  False  False  False  False   True  False
2021-03-06  False  False  False  False   True  False
相关文章
|
3天前
|
供应链 搜索推荐 数据挖掘
Pandas实战案例:电商数据分析的实践与挑战
【4月更文挑战第16天】本文通过一个电商数据分析案例展示了Pandas在处理销售数据、用户行为分析及商品销售趋势预测中的应用。在数据准备与清洗阶段,Pandas用于处理缺失值、重复值。接着,通过用户购买行为和商品销售趋势分析,构建用户画像并预测销售趋势。实践中遇到的大数据量和数据多样性挑战,通过分布式计算和数据标准化解决。未来将继续深入研究Pandas与其他先进技术的结合,提升决策支持能力。
|
3天前
|
存储 数据可视化 数据挖掘
实战案例:Pandas在金融数据分析中的应用
【4月更文挑战第16天】本文通过实例展示了Pandas在金融数据分析中的应用。案例中,一家投资机构使用Pandas加载、清洗股票历史价格数据,删除无关列并重命名,将日期设为索引。接着,数据被可视化以观察价格走势,进行基本统计分析了解价格分布,以及计算移动平均线来平滑波动。Pandas的便捷功能在金融数据分析中体现出高效率和实用性。
|
3天前
|
Python 数据挖掘 存储
Python 数据分析(PYDA)第三版(七)(4)
Python 数据分析(PYDA)第三版(七)
|
Python Shell 存储
Python 数据分析(PYDA)第三版(七)(3)
Python 数据分析(PYDA)第三版(七)
Python 数据分析(PYDA)第三版(七)(3)
|
机器学习/深度学习 数据可视化 Python
Python 数据分析(PYDA)第三版(六)(2)
Python 数据分析(PYDA)第三版(六)
|
机器学习/深度学习 Python 数据挖掘
Python 数据分析(PYDA)第三版(六)(1)
Python 数据分析(PYDA)第三版(六)
|
3天前
|
Python 数据格式 XML
Python 数据分析(PYDA)第三版(三)(1)
Python 数据分析(PYDA)第三版(三)
|
3天前
|
数据挖掘 索引 Python
Python 数据分析(PYDA)第三版(二)(3)
Python 数据分析(PYDA)第三版(二)
|
3天前
|
存储 数据挖掘 索引
Python 数据分析(PYDA)第三版(二)(1)
Python 数据分析(PYDA)第三版(二)
Python 数据分析(PYDA)第三版(二)(1)
|
3天前
|
数据挖掘 Python 索引
Python 数据分析(PYDA)第三版(一)(3)
Python 数据分析(PYDA)第三版(一)
Python 数据分析(PYDA)第三版(一)(3)