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 表合并
- pd.concat()
pd.concat(表1,表2,axis = 0)
axis = 0是纵向合并(行添加),1为横向(列添加) - df.append()
df_name.append(other_df)
纵向追加 - 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级别的保存与读取
pd.read_csv("new_infor.csv",index_col='索引名')
pd.read_csv(r"文件路径")
网友评论