pandas库的学习(个人用)

pandas库的学习(个人用)

为什么要学习pandas?

numpy能够帮我们处理处理数值型数据,但是这还不够

很多时候,我们的数据除了数值之外,还有**字符串,还有时间序列**等

所以,numpy能够帮助我们处理数值,但是pandas除了处理数值之外(基于numpy),还能够帮助我们处理其他类型的数据

pandas的常用数据类型

Series 一维,带标签数组(带索引)

创建Series数组
  • 方法一: 列表型

    pd.Series([1,5,8,67,9],index = list('abcde'))

    输出结果为:

    a 1
    b 5
    c 8
    d 67
    e 9
    dtype: int64

    前为index,后为value

    index是人为添加数据的索引,用list类型

  • 方法二: 字典型

    import pandas as pd
    temp_dict = {'name':'xiaohong','age':30,'tel':10086}
    t = pd.Series(temp_dict)
    print(t)
    

    输出结果为:

    name xiaohong
    age 30
    tel 10086
    dtype: object

    • 创建字典:

      import string
      a = {string.ascii_uppercase[i]:i for i in range(5)}
      print(a)
      

      输出结果为:

      {‘A’: 0, ‘B’: 1, ‘C’: 2, ‘D’: 3, ‘E’: 4}

      i 最大为26(字母只有26个)

      同理,ascii_lowercase为小写字母

    重新给其指定其他的索引之后,如果能够对应上,就取其值,如果不能,就为Nan.示例如下:

    import string
    import pandas as pd
    a = {string.ascii_uppercase[i]:i for i in range(10)}
    print(a)
    b = pd.Series(a,index=list(string.ascii_uppercase[5:15]))
    print(b)
    

    b的输出结果为:

    F 5.0
    G 6.0
    H 7.0
    I 8.0
    J 9.0
    K NaN
    L NaN
    M NaN
    N NaN
    O NaN
    dtype: float64

Series列表的detype修改:

a.astype(float) 即同numpy的修改方法

Series列表的索引:
  • 方法一:类似字典,输入a[索引]

    如果输入不存在的索引,得到的value为 NaN

  • 方法二:下标索引,a[1]

    索引多行与普通索引方式相同

pandas读取外部数据(读出来的结果是DataFrame)

当文件为csv时:

df = pd.read_csv("数据地址")

此外,pd.read_ 后面可以加很多类型的文件,可以根据需求选择

DataFrame 二维,Series容器

DataFrame的创建
  • pd.DataFrame(np.arange(12).reshape((3,4)))

    输出结果为:

    ​ 0 1 2 3
    0 0 1 2 3
    1 4 5 6 7
    2 8 9 10 11

    竖的和横的都是索引,DataFrame对象既有行索引,又有列索引

    行索引,表明不同行,横向索引,叫index,0轴,axis=0

    列索引,表名不同列,纵向索引,叫columns,1轴,axis=1

    行索引和列索引也可以如Series一样认为指定

将字典传入DataFrame(注意,DataFrame也可以传入列表)
import pandas as pd
d1 = {"name":["xiaoming",
"xiaogang"],"age":[20,32],"tel":[10086,10010]}
d1 = pd.DataFrame(d1)
print(d1)

输出结果为:

​ name age tel

0 xiaoming 20 10086
1 xiaogang 32 10010

一行即为一条数据

DataFrame整体情况查询(不得不感叹功能强大)

df.head(3) # 显示头部几行,默认5行

df.tail(3) # 显示未尾几行,默认5行

df.info() # 相关信息概览: 行数,列数,列索引,列非空值个数,列类型,列类型,内存占用

df.describe() #快速综合统计结果: 计数,均值,标准差,最大值,四分位数,最小值

DataFrame中排序的方法

df = df.sort_value(by = '',ascending = True)by表示按照什么排序,ascending表示升序还是降序,默认为True,降序

DataFrame取行取列操作(即切片)

方括号写数字,表示取行,对行进行操作

写字符串,表示取列,对列进行操作

pd.loc[]:表示通过标签索引行数据

pd.iloc[]表示通过位置获取行数据

DataFrame布尔类型的索引

df[]方括号内写条件,一次只能写一条,如果有多个条件,则需要用&或者|连接两个条件,不同的条件之间需要用括号括起来,(df[]&df[])

&表示且,|表示或

字符串处理:

image-20231104105036344

数据汇总描述

describe()函数和include()函数

语法:df.decribe(include = [""])

describe() 函数输出了平均值、std 和 IQR 值(四分位距)等一系列统计信息。通过 describe() 提供的include能够筛选字符列或者数字列的摘要信息。

include 相关参数值说明如下:

  • object: 表示对字符列进行统计信息描述;
  • number:表示对数字列进行统计信息描述;
  • all:汇总所有列的统计信息。

感觉all的情况可以直接不传include()

pandas使用自定义函数

1) 操作整个 DataFrame 的函数:pipe()

示例如下:

import pandas as pd
import numpy as np
#自定义函数
def adder(ele1,ele2):
   return ele1+ele2
#操作DataFrame
df = pd.DataFrame(np.random.randn(4,3),columns=['c1','c2','c3'])
#相加前
print(df)
#相加后
print(df.pipe(adder,3))

输出结果为:

         c1        c2        c3
0  1.989075  0.932426 -0.523568
1 -1.736317  0.703575 -0.819940
2  0.657279 -0.872929  0.040841
3  0.441424  1.170723 -0.629618
         c1        c2        c3
0  4.989075  3.932426  2.476432
1  1.263683  3.703575  2.180060
2  3.657279  2.127071  3.040841
3  3.441424  4.170723  2.370382

2) 操作行或者列的函数:apply()

语法:

df.apply(,axis = )

axis传入要操作的是行还是列,不传入时默认为列

3) 操作单一元素的函数:applymap()

DataFrame 数据表结构的 applymap() 和 Series 系列结构的 map() 类似,它们都可以接受一个 Python 函数,并返回相应的值。

语法:

df[].map(lambda x:x*100)

df.applymap(lambda x:x*10)

这两个需结合map和lambda去理解

pandas缺失数据的处理

数据缺失有两种情况,一种是空,None,即nan,另一种是本来就是零

将一个数据变成nan的方法:a = np.nan

判断数据是否是nan

pd.isnull()括号内传入数据,为nan的地方全是True

pd.notnull()得到的结果与上面相反

处理方法1:删除

df.dropna(axis,how,inplace)

axis指定索引的是行还是列

how传入两种参数—‘any’:表示只要含有nan的就整行或整列的删除;‘all’'表示只有一整行或者一整列都是nan的情况下才删除

inplace表示是否进行原地修改,默认为False,即不进行原地修改

处理方法2:填充数据

df.fillna()传入一个数字,即可以将nan变成那个数字,一般传入均值,即df.fillna(df.mean())

计算平均值等情况,nan是不参与计算的,但是0会

统计方法和字符串离散化:

统计人数的方法:

print(len(df['Director'].unique()))

unique会将重复数据删掉,并返回一个列表

或者

print(set(len(df["Director"].tolist()))

也能得到相同的结果

遍历嵌套列表的方法

a = [i for j in list for i in j]

字符串离散化用来统计

如果要统计某一个字符串出现了几次,可以创建一个全是零的数组,出现一次该字符串就将零变成一,之后再进行求和操作

数据合并

join(行)

join默认情况是将行索引相同的合并在一起

如果合并的两组数据行数不一样,df1.join(df2) 则以df1为准.

即: df1行数更多时,df2缺少的那些行为NaN

​ df1行数更少时,df2多出的那些行不添加进去

merge(列)

merge:按照指定的列把数据按照一定的方式合并到一起

默认的合并方式: inner 交集

merge outer :并集, NaN补全

merge left :左边为准, NaN补全

merge right: 右边为准, NaN补全

语法:

df1.merge(df2,on = '',how = '')

on: 传入列索引的具体索引来合并

  • 如果没有相同的列索引,则可以用left_on = ''right_on = ''进行一一对应

how: 传入合并方式

image-20231105103106689

有点抽象,给张图片辅助理解下

数据的分组

创建groupby分组对象

groupby可以沿任意轴分组,分组时可以按指定的键(key)作为每组的组名,方法如下:

  • df.groupby(“key”)
  • df.groupby(“key”,axis=1)
  • df.groupby([“key1”,“key2”])
查看分组结果

1)groups查看分组结果

语法:

df.groupby('key').groups

key指示按照什么来进行分组

示例:

import pandas as pd
import numpy as np
data = {'Name': ['John', 'Helen', 'Sona', 'Ella'],
   'score': [82, 98, 91, 87],
   'option_course': ['C#','Python','Java','C']}
df = pd.DataFrame(data)
#查看分组
print(df.groupby('score').groups)

输出结果为:

{82: Int64Index([0], dtype='int64'), 
87: Int64Index([3], dtype='int64'), 
91: Int64Index([2], dtype='int64'), 
98: Int64Index([1], dtype='int64')}

2)多个列标签分组

简单概括就是groupby传入一个[‘key1’,‘key2’]

输出结果类似如下示例:

{('Ella', 87): Int64Index([3], dtype='int64'), 
('Helen', 98): Int64Index([1], dtype='int64'), 
('John', 82): Int64Index([0], dtype='int64'), 
('Sona', 91): Int64Index([2], dtype='int64')}
通过get_group()方法选择组内具体数据项
import pandas as pd
import numpy as np
data = {'Name': ['John', 'Helen', 'Sona', 'Ella'],
   'score': [82, 98, 91, 87],
   'option_course': ['C#','Python','Java','C']}
df = pd.DataFrame(data)
#根据score来分组
grouped=df.groupby('score')
#根据对应组的数据值,选择一个组
print(grouped.get_group(91))

输出结果为:

Name  score option_course
2  Sona     91          Java

用什么key来进行分组,就只能用该key内的具体数据项来索引

遍历分组数据

用for循环即可遍历

groupby分组后每一个元素都是元组类型,元组内第一个元素是组的名称,第二个元素是df数据

因此,可以用如下的方法遍历分组数据

import pandas as pd
import numpy as np
data = {'Name': ['John', 'Helen', 'Sona', 'Ella'],
   'score': [82, 98, 91, 87],
   'option_course': ['C#','Python','Java','C']}
df = pd.DataFrame(data)
#查看分组
grouped=df.groupby('score')
for label, option_course in grouped:
#其中key代表分组后字典的键,也就是score
    print(label)
#字典对应的值选修的科目
    print(option_course)

输出结果;

82
   Name  score   option_course
0  John     82            C#
87
   Name  score   option_course
3  Ella     87             C
91
   Name  score   option_course
2  Sona     91          Java
98
    Name  score  option_course
1  Helen     98        Python

索引和复合索引

简单的索引操作:

•获取index:df.index

•指定index :df.index = [‘x’,‘y’]

•重新设置index : df.reindex(list(“abcedf”))

•指定某一列作为index :df.set_index(“Country”,drop=False)

默认drop为True,即去取出索引的数据之后,将源数据删除

•返回index的唯一值:df.set_index(“Country”).index.unique()

    C#

87
Name score option_course
3 Ella 87 C
91
Name score option_course
2 Sona 91 Java
98
Name score option_course
1 Helen 98 Python


## 索引和复合索引

简单的索引操作:

•获取index:df.index

•指定index :df.index = ['x','y']

•重新设置index : df.reindex(list("abcedf"))

•指定某一列作为index :df.set_index("Country",drop=False)

默认drop为True,即去取出索引的数据之后,将源数据删除

•返回index的唯一值:df.set_index("Country").index.unique()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值