美文网首页
Pandas基础 (2020.04.08)

Pandas基础 (2020.04.08)

作者: 似海深蓝 | 来源:发表于2020-04-08 18:41 被阅读0次

    1. Series的定义与使用

    • Series 是一个带有名称显性索引一维数组
    • Series 中包含的数据类型可以是整数、浮点、字符串、列表、元组、ndarray等(类型唯一,否则向上转型)。
    # pd.Series(['data=None', 'index=None', 'dtype=None', 'name=None'],)
    import numpy as np
    import pandas as pd
    
    1.默认索引
    pd.Series([1,2,3,4])  #大小写敏感
    # out: index  value
    # 0    1
    # 1    2
    # 2    3
    # 3    4
    # dtype: int64
    
    pd.Series([1,2,3,4]).values
    # out: array([1, 2, 3, 4])  Series底层为np数组,故有相同性质
    # 当dtype为Object时,大多数都是字符串
    pd.Series([1,2,3,4]).index   #获取索引值,也可以切片
    
    2.添加索引标签
    index_labels = ['蜘蛛侠', '灭霸', '奇异博士', '钢铁侠', '蝙蝠侠', '索尔']
    age = [22, 3000, 33, 37, 40, 1500]  # data 只能是一维
    
    heroes_age = pd.Series(data=age,index=index_labels)   #索引index作为pd.Series()中的参数来为heroes_age指定索引
    # 等价于
    heroes_age.index = age   #前提是,值已经用pd.Series生成,此时只需要替换index
    heroes_age 
    
    # 输出:
    # 蜘蛛侠       22
    # 灭霸      3000
    # 奇异博士      33
    # 钢铁侠       37
    # 蝙蝠侠       40
    # 索尔      1500
    # dtype: int64
    
    3. 切片与取值
    3.1 切片
    heroes_age[0:5]  ·#索引值切左闭右开,结果到蝙蝠侠。
    #也可以用自定义索引来切
    heroes_age[0:‘索尔’]  #索引标签切,左闭右闭
    #序列结果
    heroes_age[['索引标签' or 索引值,]]
    
    3.2 Series名字与索引名字
    # Series名字
    heroes_age.name = '英雄年龄'  #也可以在pd定义时用参数加
    # Series索引名字
    heroes_age.index.name = '英雄名称'
    
    3.3 get方法,与Dict一样
    heroes_age.get(index_label,取不到值的返回值)
    

    2. DataFrame的定义与使用

    DataFrame 是一个带有索引二维数据结构,每列可以有自己的名字,并且可以有不同的数据类型。你可以把它想象成一个 excel 表格或者数据库中的一张表,也可以将它想象成由多个Series拼接成的一个DataFrame,公用一个索引,它是最常用的 Pandas 对象。

    pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
    
    1. 数组转换成DataFrame
    a=np.arange(1,10).reshape(3,3)
    pd.DataFrame(a)
    
    数组转换
    2. 字典转化
    # "键"会作为列标签,"键"对应的"值"会作为该列名对应的数据列。
    
    data = {"年龄":[19, 3000, 30, 37, 40, 1500], 
            "出生地":["纽约皇后区", "泰坦星球","费城", "纽约", "哥谭",  "阿斯加德" ]}
    index=pd.Index(['蜘蛛侠', '灭霸', '奇异博士', '钢铁侠','蝙蝠侠', '索尔' ],name='英雄名')
    
    aa=pd.DataFrame(data=data,index=index)
    aa
    
    #行索引:Index(['蜘蛛侠', '灭霸', '奇异博士', '钢铁侠', '蝙蝠侠', '索尔'], dtype='object', name='英雄名')
    aa.index
    #列索引:Index(['年龄', '出生地'], dtype='object')
    aa.columns
    
    字典转换
    3.通过嵌套列表转化,更加直观化
    # 先构建一个二维数组data,ndarray也可以
    # 然后再生成一个列标签columns,
    # 最后生成一个Index对象。这样,data、colunms、Index三个对象就构成了DataFrame。
    
    data = [[19, "纽约皇后区"], 
            [3000, "泰坦星球"], 
            [30, "费城"], 
            [37, "纽约"], 
            [40, "哥谭"], 
            [1500, "阿斯加德"]]
    
    index = pd.Index(data=['蜘蛛侠', '灭霸', '奇异博士', '钢铁侠','蝙蝠侠', '索尔' ], name="英雄姓名")
    columns =pd.Index(data=["年龄", "出生地"], name="属性")
    
    user_info_01 = pd.DataFrame(data=data, index=index, columns=columns)
    user_info_01
    
    嵌套列表转化

    3. DataFrame的数据提取

    3.1 根据列标签提取列

    user_info=user_info_01.copy()
    user_info['出生地']   #取值
    user_info.出生地   #与上边通用
    
    #输出:
    英雄姓名
    蜘蛛侠     纽约皇后区
    灭霸       泰坦星球
    奇异博士       费城
    钢铁侠        纽约
    蝙蝠侠        哥谭
    索尔       阿斯加德
    Name: 出生地, dtype: object
    
    #提取多列,也可以用于列位置的互换,返回新的DataFrame
    user_info[["出生地", "年龄"]]
    
    取多列

    3.2 取行(.loc[] 与 .iloc[])

    df.loc[ ]语法 user_info.loc[索引行,索引列 ]适用于有行列标签情况

    3.2.1 行列都限定
    3.2.2 限定行,取所有列
    3.2.3 限定列,取所有行

    以上代码均返回DataFrame对象,如果要返回可直接操作数据如下:


    可操作数据
    3.2.4 iloc

    df.iloc[ ]语法 user_info.iloc[索引行,索引列 ] iloc意识是:index_loc


    注意:取DataFrame情况

    多行情况

    3.3 数据的增加与修改

    1. 增加行,源结构无神奇女侠
    user_info.loc['神奇女侠',:] = [2000,'天堂岛', None]
    
    2. 更该行
    #修改奇异博士的年龄:30岁变35岁
    user_info.loc['奇异博士',:] = [35,'费城', None]
    
    3. 更改特定属性值
    user_info.loc['奇异博士','年龄'] = 36
    user_info.iloc[2,0] = 36
    
    4. 增加或修改列,常用的为将序列赋值到列
    # List、Tuple、ndarray、Series、range等
    user_info['性别'] = ['男','男','男','男','男','男','女']
    user_info['性别'] = '男'  #自动填充整列
    
    5. 删除
    # df.drop(['labels=None', 'axis=0', 'index=None', 'columns=None', 'level=None', 'inplace=False'],) 
    user_info.drop(index="灭霸")  #drop行,不改变原表
    user_info.drop(columns='血型')  #drop,列
    user_info.drop(axis=1,labels='血型')  #axis = 0为行,1为列
    
    # 删除某行后的全部行,关键在于tolist
    index_list = user_info.index.tolist()[x:y]  #用切片
    user_info.drop(index = index_list)
    
    6. 更改列的顺序
      1) 直接DF[名字list] -> step_02=new_infor[['Hero Name','Sex','Age','Birthplace','weapon']]
      #注意,1)不赋值的话不改变原表
      2) 列很多的情况
        先 new_infor.columns[] 和tolist变化赋值做出目标List
        然后在用 1)
    
    7.更改索引和列名
      1) 改索引:df.index = 新索引list
         列:df.colums = []
      2) 用rename()
         old_index=['蜘蛛侠', '灭霸', '奇异博士', '钢铁侠', '蝙蝠侠', '索尔']
         new_index=["荷兰弟","乔什·布洛林","本尼迪克特·康伯巴奇","小罗伯特·唐尼","本·阿弗莱克","克里斯·海姆斯沃斯"]
         index=dict(zip(old_index,new_index))
         df.rename(index=index)  #会新旧一一对应的改
      3) 列名同理:
         c={"年龄":"Age","出生地":"Birthplace","血型":" blood group"}
         df=df.rename(columns=c)
    
    

    3.4 表级操作

    3.4.1 表合并
    1. pd.concat()
      pd.concat(表1,表2,axis = 0) axis = 0是纵向合并(行添加),1为横向(列添加)
    2. df.append()
      df_name.append(other_df)纵向追加
    3. pd.merge() 类SQL连接
      pd.merge('df1', 'df2', "how='inner'", 'on=None', 'left_on=None', 'right_on=None)
    - how:
        - left:仅使用左框架中的键,类似于SQL左外连接;保留关键顺序
        - right:仅使用右框架中的键,类似于SQL右外连接;保留关键顺序
        - outer:使用来自两个帧的键的并集,类似于SQL full outer加入;按字典顺序排序键
        - inner:使用两个帧的交集,类似于SQL内部加入;保留左键的顺序
    
    
    pd.merge(user_info_01,user_info_02,how="left",left_on="Hero Name",right_on="英雄名")
    等价于SQL
    select * 
    from user_info_01 left join user_info_02 
         on user_info_01.'Hero Name' = user_info_02.'英雄名字'
    

    4. 保存与读取

    4.1 DF对象的保存

    df_name.to_csv("new_file.csv")

    4.2 Pandas级别的保存与读取

    1. pd.read_csv("new_infor.csv",index_col='索引名')
    2. pd.read_csv(r"文件路径")

    相关文章

      网友评论

          本文标题:Pandas基础 (2020.04.08)

          本文链接:https://www.haomeiwen.com/subject/yuozphtx.html