Python数据分析之pandas(保姆级教程)

一、前言

一般情况下,numpy总是和pandas一起出现。如果numpy处理的数据类似于list类型的话,那么pandas处理的数据就类似于dictionary类型。

二、前提准备

使用pandas的话,需要将pandas这个第三方包,提前下载到你的python解释器中。
(1)Win + R,输入cmd,然后点击确定
在这里插入图片描述
(2)在Windows的终端中输入如下命令,然后回车

pip install pandas

在这里插入图片描述

三、具体使用

1.基本使用

(1)使用pandas生成序列
# coding:utf-8
import pandas as pd
import numpy as np
# 通过pandas生成序列

# NAN :not a number,但是类型是float
s = pd.Series([1, 3, 6, np.NAN, 66, 88])
print(s)

在这里插入图片描述

(2)生成日期序列
# 生成一个日期序列,生成六个数据
dates = pd.date_range('20220822', periods=6)
print(dates)

在这里插入图片描述

(3)生成DataFrame
# 6行4列 ,日期使用的是上面的8.22到8.27
# DataFrame非常类似于Excel表格,最左侧为行名称,最上面是列名称
# index代表行名称,column代表列名称
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=['a', 'b', 'c', 'd'])
print(df)

print("-" * 50)
# 使用DataFrame的默认行名称和列名称
df1 = pd.DataFrame(np.arange(12).reshape((3, 4)))
print(df1)

在这里插入图片描述

(4)使用字典参数生成DataFrame
# 使用字典作为DateFrame的参数
# 字典的key作为列名,value作为一列中的数值,行数取决于列中最多元素数量
df2 = pd.DataFrame({'A': 1.0, 'B': pd.Timestamp('20210701'),
                    'C': pd.Categorical(['test1', 'test2', 'test3', 'test4']), 'D': 'ff'})
print(df2)

在这里插入图片描述

(5)Dataframe的属性
# 输出数据类型
print(df2.dtypes)
# 打印行名称
print(df2.index)
# 打印列名称
print(df2.columns)

# 打印值
print(df2.values)
# 打印描述信息
print(df2.describe())

在这里插入图片描述

(6)在Dataframe中进行排序
# 排序, axis=1指的是列名称;axis=0指的是行名称,ascending=False表示逆序
df2 = df2.sort_index(axis=1, ascending=False)

print(df2)
print("-" * 50)
df2 = df2.sort_index(axis=0, ascending=False)
print(df2)

print("%" * 50)
# 根据C列数值进行排序
df2 = df2.sort_values(by='C')
print(df2)

在这里插入图片描述

(7)对Dataframe进行转置
# 转置
print(df2.T)

在这里插入图片描述

2.选择数据

(1)选择列
# coding:utf-8
import numpy as np
import pandas as pd
"""
    pandas从DateFrame中选取一行
"""

# 生成日期序列
dates = pd.date_range('2022.07.01', periods=6)

# 生成DateFrame
df = pd.DataFrame(np.arange(24).reshape((6,4)), index=dates, columns=['A', 'B', 'C', 'D'])
print(df)
# 选取第A列
print(df.A)
print("-" * 50)
print(df['A'])

在这里插入图片描述

(2)通过“切片”选择数据
print("-" * 50)
# 按行切片,左闭右开
print(df[1:3])
print("&" * 50)

# 按行索引名进行切片,左闭右闭
print(df['20220703':'20220705'])

在这里插入图片描述

(3)根据标签进行选择数据
# 根据行标签(行名)进行选取值
print("-" * 50)
print(df.loc['20220701'])

在这里插入图片描述

# 选取列标签
print("-" * 50)
# 所有行中的B、C两列
print(df.loc[:, ['B', 'C']])

在这里插入图片描述

# 输出指定行中的,指定列
print("-" * 50)
print(df.loc["20220702", ['C', 'D']])

在这里插入图片描述

(4)根据位置选择数据
# 根据位置进行筛选
print("-" * 50)
print(df.iloc[3])

在这里插入图片描述

print("-" * 50)
print(df.iloc[[1,3,5], 1:3])

在这里插入图片描述

(5)根据条件进行选择数据
# 通过条件进行筛选,通过A列进行筛选,显示所有的信息
print("-" * 50)
print(df[df.A > 8])

在这里插入图片描述

3. 设置值

设置值的本质就是:先选择数据,然后再赋值
(1)通过位置选择数据,然后改变数据
# coding:utf-8
import numpy as np
import pandas as pd

"""
   在指定位置进行替换值 
"""

dates = pd.date_range('20220701', periods=6)
# print(dates)
df = pd.DataFrame(np.arange(24).reshape((6,4)), index=dates, columns=['A', 'B', 'C', 'D'])
print(df)

# 改变指定位置的值
# 通过位置进行改变
df.iloc[2, 2] = 666
print("-" * 50)
print(df)

在这里插入图片描述

(2)通过标签选择数据,然后改变数据
# 通过标签进行改变
df.loc['20220701', 'B'] = 999
print("-" * 50)
print(df)

在这里插入图片描述

(3)通过选择列选择数据,然后改变数据
df['D'] = np.NAN
print(df)

在这里插入图片描述

(4)给Dataframe新加一列
# 在DataFrame上新加一列
df['E'] = pd.Series([1, 2, 3, 4, 5, 6], index=pd.date_range('20220701', periods=6))
print("-" * 50)
print(df)

在这里插入图片描述

(5)通过条件选择数据,然后改变数据
# 条件判断,只要A列中有大于0的所有行的所有数据全部改变!
# 中括号中,进行的筛选是:筛选A列中的行
df[df.A > 0] = 2222
print(df)

在这里插入图片描述

4.处理丢失数据

(1)丢弃NaN值
# coding:utf-8
import numpy as np
import pandas as pd

dates = pd.date_range('20220701', periods=6)
# print(dates)
df = pd.DataFrame(np.arange(24).reshape(6, 4), index=dates, columns=['A', 'B', 'C', 'D'])
# print(df)

# 改变数据
df.iloc[0, 1] = np.NAN
df.iloc[1, 2] = np.NAN
print("-" * 50)
print(df)


"""
    丢弃nan
"""

# 丢弃nan, anis=1表示列方向, how的方式是:
# all的话,就是一整行或者一整列都是nan的话,才进行丢弃
# any的话,只要一行里面或者一列里面有nan,就丢弃整行或者整列
df = df.dropna(axis=1, how='any')
print("-" * 50)
print(df)

在这里插入图片描述

(2)替换NaN值
"""
    替换nan
"""

print(df.fillna(value=0))

在这里插入图片描述

(3)判断df的各个位置上是否缺失数据
# 看看是否缺失数据,
# 在Dataframe的对应元素位置上进行判断,如果缺失显示True;如果不缺失显示False
print(df.isnull())

在这里插入图片描述

(4)判断df中是否存在NaN值
# 看看df中是否有NaN
print("-" * 50)
print(np.any(df.isnull()) == True)

在这里插入图片描述

5.导入导出数据

(1)读取数据
import numpy as np
import pandas as pd
"""
    用pandas导入导出数据
"""

# 读取数据,可以读取各自格式的数据。比如:read_csv、read_excel、read_html
data = pd.read_csv("AAH691(2).csv", encoding='gb18030')
print(data)

在这里插入图片描述

(2)存储数据
# 保存成pickle格式的文件,也可以保存成其他格式的问题,比如csv、html等。与读取一一对应
# 保存数据
data.to_pickle('test.pickle')

在这里插入图片描述
在这里插入图片描述

6.使用contact合并Dataframe

(1)contact竖直方向合并
# coding:utf-8
import numpy as np
import pandas as pd

"""
    pandas中的合并
"""

# 创建数据框架
df1 = pd.DataFrame(np.ones((3, 4))*0, columns=['a', 'b', 'c', 'd'])
df2 = pd.DataFrame(np.ones((3, 4))*1, columns=['a', 'b', 'c', 'd'])
df3 = pd.DataFrame(np.ones((3, 4))*2, columns=['a', 'b', 'c', 'd'])

print("-" * 50)
print(df1)
print("-" * 50)
print(df2)
print("-" * 50)
print(df3)

# 使用函数,在竖直方向进行合并, axis为0时,表示竖直方向的合并
print("-" * 50)
# ignore_index=True表示对合并之后的数据进行重新排序
res = pd.concat([df1, df2, df3], axis=0, ignore_index=True)
print(res)

在这里插入图片描述

(2)contact水平方向合并
# 使用函数,在竖直方向进行合并, axis为0时,表示竖直方向的合并
# axis为1时,表示水平方向的合并
print("-" * 50)
# ignore_index=True表示对合并之后的数据进行重新排序
res = pd.concat([df1, df2, df3], axis=1)
print(res)

在这里插入图片描述

(3)outer方式合并
print("-" * 50)
df1 = pd.DataFrame(np.ones((3, 4))*0, columns=['a', 'b', 'c', 'd'], index=[1, 2, 3])
df2 = pd.DataFrame(np.ones((3, 4))*2, columns=['b', 'c', 'd', 'e'], index=[2, 3, 4])
print(df1)
print("-" * 50)
print(df2)

# 使用concat进行合并
# 默认join是outer; 也可以使用inner
# inner合并相同列;outer全部并起来,没有的列用NaN填充
# ignore_index使得合并之后,顺序井然
# inner类似于交集,outer类似于并集
res = pd.concat([df1, df2], join="outer", ignore_index=True)
print("-" * 50)
print(res)

在这里插入图片描述

(4)inner方式合并
# 使用concat进行合并
# 默认join是outer; 也可以使用inner
# inner合并相同列;outer全部并起来,没有的列用NaN填充
# ignore_index使得合并之后,顺序井然
# inner类似于交集,outer类似于并集
res = pd.concat([df1, df2], join="inner", ignore_index=True)
print("-" * 50)
print(res)

在这里插入图片描述

(5)使用append进行添加df
"""
    append的使用,默认数据框架df进行纵向合并,添加到最下面
"""
df1 = pd.DataFrame(np.ones((3, 4))*0, columns=['a', 'b', 'c', 'd'], index=[1, 2, 3])
df2 = pd.DataFrame(np.ones((3, 4))*2, columns=['a', 'b', 'c', 'd'], index=[2, 3, 4])
df3 = pd.DataFrame(np.ones((3, 4))*3, columns=['a', 'b', 'c', 'd'], index=[2, 3, 4])
print("-" * 50)
print(df1)
print("-" * 50)
print(df2)
print("-" * 50)
print(df3)
print("-" * 50)
# 参数ignore_index为True是为了让索引有序!!!
res = df1.append([df2, df3], ignore_index=True)
print(res)

在这里插入图片描述

(6)使用append添加Series
# 添加序列
s1 = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
print(s1)
print("-" * 50)
res = df1.append(s1, ignore_index=True)
print(res)

在这里插入图片描述

7.使用merge合并Dataframe

(1)基于公共列进行合并
# coding:utf-8
import numpy as np
import pandas as pd

"""
    merge的使用
"""

# 可以将dataframe的格式理解成数据库中的表
left = pd.DataFrame({'key':['K0', 'K1', 'K2', 'K3'],
                    'A':['A0', 'A1', 'A2', 'A3'],
                    'B':['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key':['K0', 'K1', 'K2', 'K3'],
                    'C':['C0', 'C1', 'C2', 'C3'],
                    'D':['D0', 'D1', 'D2', 'D3']})

print(left)
print("-" * 50)
print(right)
print("-" * 50)
# 通过merge进行合并
# 基于key列进行合并
res = pd.merge(left, right, on='key')
print(res)

在这里插入图片描述

(2)inner形式的merge合并
print("-" * 50)
left = pd.DataFrame({'key1':['K0', 'K0', 'K1', 'K2'],
                     'key2':['K0', 'K1', 'K0', 'K1'],
                    'A':['A0', 'A1', 'A2', 'A3'],
                    'B':['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key1':['K0', 'K1', 'K1', 'K2'],
                      'key2':['K0', 'K0', 'K0', 'K0'],
                    'C':['C0', 'C1', 'C2', 'C3'],
                    'D':['D0', 'D1', 'D2', 'D3']})

print(left)
print("-" * 50)
print(right)

# 使用merge进行合并,默认合并方式是inner,去掉

# how四种方式:inner 、outer 、left 、right
print("-" * 50)
res = pd.merge(left, right, on=['key1', 'key2'], how="inner")
print(res)

在这里插入图片描述

(3)outer形式的merge合并
# 使用merge进行合并,默认合并方式是inner,去掉

# how四种方式:inner 、outer 、left 、right
print("-" * 50)
res = pd.merge(left, right, on=['key1', 'key2'], how="outer")
print(res)

在这里插入图片描述

(4)right形式的merge合并
# how四种方式:inner 、outer 、left 、right
print("-" * 50)
res = pd.merge(left, right, on=['key1', 'key2'], how="right")
print(res)

在这里插入图片描述

(5)left形式的merge合并
# how四种方式:inner 、outer 、left 、right
print("-" * 50)
res = pd.merge(left, right, on=['key1', 'key2'], how="left")
print(res)

在这里插入图片描述

(6)merge参数之indicator
df1 = pd.DataFrame({'col1':[0, 1], 'col_left':['a', 'b']})
df2 = pd.DataFrame({'col1':[1, 2, 2], 'col_right':[2, 2, 2]})
print("-" * 50)
print(df1)
print("-" * 50)
print(df2)

# indicator参数表示显示合并方式,indicator_column为显示合并方式列的列名
res = pd.merge(df1, df2, on='col1', how='outer', indicator="indicator_column")
print("-" * 50)
print(res)

在这里插入图片描述

(7)merge参数之index
left = pd.DataFrame({'A':['A0', 'A1', 'A2'],
                     'B':['B0', 'B1', 'B2']},
                    index=['K0', 'K1', 'K2'])

right = pd.DataFrame({'C':['C0', 'C1', 'C2'],
                      'D':['D0', 'D1', 'D2']},
                     index=['K0', 'K2', 'K3'])

print("-" * 50)
print(left)
print("-" * 50)
print(right)
print("-" * 50)
# 这里的how参数outer指的是,合并左侧索引和右侧索引
res = pd.merge(left, right, left_index=True, right_index=True, how='outer')
print(res)

在这里插入图片描述

(8)merge参数之suffixes
boys = pd.DataFrame({'k':['K0', 'K1', 'K2'], 'age':[1, 2, 3]})
girls = pd.DataFrame({'k':['K0', 'K0', 'K3'], 'age':[4, 5, 6]})

print("-" * 50)
print(boys)
print("-" * 50)
print(girls)

# suffixes参数合并之后,重命名列名,在原来列表后面进行修改,以显示不同
res = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='outer')
print("-" * 50)
print(res)

在这里插入图片描述

8. numpy和pandas处理数据之后,用matplotlib进行绘制图像

(1)对Series数据进行绘制线性图
# coding:utf-8
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data = pd.Series(np.random.randn(1000), index=np.arange(1000))
# 对数据进行累加
data = data.cumsum()
data.plot()
plt.show()

在这里插入图片描述

(2)对Dataframe数据进行绘制线性图
# 使用dataframe
# 4代表生成4组数据
data = pd.DataFrame(np.random.randn(1000, 4),
                    index=np.arange(1000),
                    columns=["A", "B", "C", "D"])

# 进行累计
data = data.cumsum()
# print(data.head(5))
data.plot()
# 展示
plt.show()

在这里插入图片描述

(3)对Dataframe数据进行绘制散点图
ax = data.plot.scatter(x='A', y='B', color='DarkBlue', label='Class 1')
data.plot.scatter(x='A', y='C', color='DarkGreen', label='Class 2', ax=ax)
plt.show()

在这里插入图片描述

pandas总结完毕,撒花撒花…

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值