美文网首页
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