1 Pandas基础
1.1 数据结构
1.1.1 Series 一维
#创建
#1.列表创建
>>> pd.Series(['a','b','c','d'])
0 a
1 b
2 c
3 d
dtype: object
#2.设置索引index
>>> pd.Series(['a','b','c','d'],index=['z1','z2','z3','z4'])
z1 a
z2 b
z3 c
z4 d
dtype: object
#3.字典创建
>>> pd.Series({'z1':'a','z2':'b','z3':'c','z4':'d'})
z1 a
z2 b
z3 c
z4 d
dtype: object
#索引
>>> se
z1 a
z2 b
z3 c
z4 d
dtype: object
#1.位置索引
dtype: object
>>> se[0]
'a'
#2.标签索引
>>> se['z1']
'a'
#3.切片索引
>>> se[1:4]
z2 b
z3 c
z4 d
dtype: object
#属性index和values
>>> se.index
Index(['z1', 'z2', 'z3', 'z4'], dtype='object')
>>> se.values
array(['a', 'b', 'c', 'd'], dtype=object)
1.1.2 DataFrame 二维
#创建对象
#1.列表创建
>>> pd.DataFrame([['John',60],['Amy',99],['Jack',80]])
0 1
0 John 60
1 Amy 99
2 Jack 80
#2.列标签columns,行标签index
>>> pd.DataFrame([['John',60],['Amy',99],['Jack',80]],columns=['name','score'],index=['s01','s02','s03'])
name score
s01 John 60
s02 Amy 99
s03 Jack 80
#dataframe属性
>>> df.values
array([['John', 60],
['Amy', 99],
['Jack', 80]], dtype=object)
>>> df.dtypes
name object
score int64
dtype: object
>>> df.index
Index(['s01', 's02', 's03'], dtype='object')
>>> df.columns
Index(['name', 'score'], dtype='object')
>>> df.T
s01 s02 s03
name John Amy Jack
score 60 99 80
Index(['name', 'score'], dtype='object')
>>> df.head() # 查看前n条,默认5条
name score
s01 John 60
s02 Amy 99
s03 Jack 80
>>> df.head(2)
name score
s01 John 60
s02 Amy 99
>>> df.tail() # 查看后n条,默认5条
name score
s01 John 60
s02 Amy 99
s03 Jack 80
>>> df.tail(2)
name score
s02 Amy 99
s03 Jack 80
>>> df.shape
(3, 2)
>>> df.info() #查看索引,数据类型和内存信息
Index: 3 entries, s01 to s03
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 3 non-null object
1 score 3 non-null int64
dtypes: int64(1), object(1)
memory usage: 180.0+ bytes
1.2 读取数据
#读取Excel
df=pd.read_excel('name.xlsx',sheet_name='表名',
header=表头所在行数,数据本身不包含列名则header=None,
index_col=以第n列的数据作为索引,
nrows=读取前n行数据,
usecols=选中的列,此处的列表表示的不是范围,
skiprows=省略指定行数的数据,从第一行开始
)
>>> df=pd.read_excel('数据2.xlsx',sheet_name='Sheet1')
>>> df
中文名 外文名 性别 国籍 身高 体重 项目 省份
0 阿尔法拉克·阿米奴 Al-Farouq Aminu 男 尼日利亚 206厘米 98kg 篮球 NaN
1 安德森•瓦莱乔 Anderson Varejao 男 巴西 211厘米 118kg 篮球 NaN
2 博涅娃 BONEVA Antoaneta 女 保加利亚 NaN NaN 射击 NaN
3 阿隆·贝内斯 Aron Baynes 男 澳大利亚 208厘米 118kg 篮球 NaN
4 埃米莉·西博姆 Emily Jane Seebohm 女 澳大利亚 1.80米 64kg 游泳 NaN
.. ... ... .. ... ... ... ... ...
229 罗贝塔·文奇 Roberta Vinci 女 意大利 NaN NaN 网球 NaN
230 梁美玉 Liang meiyu 女 中国 166cm 65kg 曲棍球 广东
231 罗晓玲 Luo Xiaoling 女 中国 NaN NaN 自行车 甘肃
232 李雪芮 Li Xue Rui 女 中国 173厘米 65kg 羽毛球 重庆
233 拉菲尼亚 Rafael 男 巴西 178cm 75kg 男子足球 NaN
[234 rows x 8 columns]
>>> df=pd.read_excel('数据2.xlsx',sheet_name='Sheet1',index_col=1,usecols=[0,1,2,5],nrows=6)
>>> df
中文名 性别 体重
外文名
Al-Farouq Aminu 阿尔法拉克·阿米奴 男 98kg
Anderson Varejao 安德森•瓦莱乔 男 118kg
BONEVA Antoaneta 博涅娃 女 NaN
Aron Baynes 阿隆·贝内斯 男 118kg
Emily Jane Seebohm 埃米莉·西博姆 女 64kg
Bahar Caglar 巴哈尔·卡格拉尔 女 76kg
#读取csv 同excel
1.3 选择数据
#loc 以列名和行名作为参数
>>> df
中文名 外文名 性别 体重
p1 阿尔法拉克·阿米奴 Al-Farouq Aminu 男 98kg
p2 安德森•瓦莱乔 Anderson Varejao 男 118kg
p3 博涅娃 BONEVA Antoaneta 女 NaN
p4 阿隆·贝内斯 Aron Baynes 男 118kg
p5 埃米莉·西博姆 Emily Jane Seebohm 女 64kg
p6 巴哈尔·卡格拉尔 Bahar Caglar 女 76kg
>>> df.loc['p3']
中文名 博涅娃
外文名 BONEVA Antoaneta
性别 女
体重 NaN
Name: p3, dtype: object
>>> df.loc['p3']['中文名']
'博涅娃'
>>> df.loc[['p2','p3']]
中文名 外文名 性别 体重
p2 安德森•瓦莱乔 Anderson Varejao 男 118kg
p3 博涅娃 BONEVA Antoaneta 女 NaN
>>> df.loc[:,['中文名','性别']]
中文名 性别
p1 阿尔法拉克·阿米奴 男
p2 安德森•瓦莱乔 男
p3 博涅娃 女
p4 阿隆·贝内斯 男
p5 埃米莉·西博姆 女
p6 巴哈尔·卡格拉尔 女
>>> df.loc[['p2','p3'],['中文名','性别']]
中文名 性别
p2 安德森•瓦莱乔 男
p3 博涅娃 女
#iloc 以行和列位置索引作为参数
>>> df.iloc[2]
中文名 博涅娃
外文名 BONEVA Antoaneta
性别 女
体重 NaN
Name: p3, dtype: object
>>> df.iloc[2][1]
'BONEVA Antoaneta'
1.4 修改行标签和列标签
#直接修改df.index属性
>>> df.index
Index(['p1', 'p2', 'p3', 'p4', 'p5', 'p6'], dtype='object')
>>> df.index=list('123456')
>>> df.index
Index(['1', '2', '3', '4', '5', '6'], dtype='object')
#用df.rename()函数
>>> df.rename(columns={'外文名':'英文名'},index={'1':'a1','2':'a2','3':'a3'},in
>>> df
中文名 英文名 性别 体重
a1 阿尔法拉克·阿米奴 Al-Farouq Aminu 男 98kg
a2 安德森•瓦莱乔 Anderson Varejao 男 118kg
a3 博涅娃 BONEVA Antoaneta 女 NaN
4 阿隆·贝内斯 Aron Baynes 男 118kg
5 埃米莉·西博姆 Emily Jane Seebohm 女 64kg
6 巴哈尔·卡格拉尔 Bahar Caglar 女 76kg
2 Pandas数据操作
2.1 数据的运算
#sum();mean();max();min()
>>> df
name price into_price
a1 football 50 20
a2 volleyball 30 10
a3 clothes 100 50
>>> df.sum()
name footballvolleyballclothes
price 180
into_price 80
dtype: object
>>> df['price'].sum()
180
>>> df['price'].mean()
60.0
>>> df.max()
name volleyball
price 100
into_price 50
dtype: object
>>> df.min()
name clothes
price 30
into_price 10
dtype: object
#标准差std();分位数quantile();众数mode();偏度skew();峰度kurt()
#describe()
>>> df.describe()
price into_price
count 3.000000 3.000000
mean 60.000000 26.666667
std 36.055513 20.816660
min 30.000000 10.000000
25% 40.000000 15.000000
50% 50.000000 20.000000
75% 75.000000 35.000000
max 100.000000 50.000000
#创建数据透视表
pands.pivot_table()
(DataFrame,values='利润(元)',index='产品',aggfunc='sum')
2.2 数据格式化
#round()设置小数位数
>>> data=df.describe()
>>> data
count 3.000000 3.000000
mean 60.000000 26.666667
std 36.055513 20.816660
min 30.000000 10.000000
25% 40.000000 15.000000
50% 50.000000 20.000000
75% 75.000000 35.000000
max 100.000000 50.000000
>>> data.round(2)
price into_price
count 3.00 3.00
mean 60.00 26.67
std 36.06 20.82
min 30.00 10.00
25% 40.00 15.00
50% 50.00 20.00
75% 75.00 35.00
max 100.00 50.00
#apply()和format()设置百分比
>>> df=pd.DataFrame(np.random.rand(5,4),columns=['a1','a2','a3','a4'])
>>> df
a1 a2 a3 a4
0 0.413184 0.860106 0.457123 0.754140
1 0.782250 0.670121 0.815621 0.480721
2 0.076142 0.667198 0.948922 0.868905
3 0.882197 0.739716 0.005118 0.328356
4 0.158483 0.240296 0.116620 0.098929
>>> df['%%%']=df['a1'].apply(lambda x:format(x,'.0%'))
>>> df
a1 a2 a3 a4 %%%
0 0.413184 0.860106 0.457123 0.754140 41%
1 0.782250 0.670121 0.815621 0.480721 78%
2 0.076142 0.667198 0.948922 0.868905 8%
3 0.882197 0.739716 0.005118 0.328356 88%
4 0.158483 0.240296 0.116620 0.098929 16%
2.3 数据表的处理
#转置df.T
>>> df
中文名 外文名 性别 体重
0 阿尔法拉克·阿米奴 Al-Farouq Aminu 男 98kg
1 安德森•瓦莱乔 Anderson Varejao 男 118kg
2 博涅娃 BONEVA Antoaneta 女 NaN
3 阿隆·贝内斯 Aron Baynes 男 118kg
>>> df.T
0 1 2 3
中文名 阿尔法拉克·阿米奴 安德森•瓦莱乔 博 涅娃 阿隆·贝内斯
外文名 Al-Farouq Aminu Anderson Varejao BONEVA Antoaneta Aron Baynes
性别 男 男 女 男
体重 98kg 118kg NaN 118kg
#转换为树形结构:行标签不变,列标签也变为行标签,为二维表格建立层次化索引
>>> df.stack()
0 中文名 阿尔法拉克·阿米奴
外文名 Al-Farouq Aminu
性别 男
体重 98kg
1 中文名 安德森•瓦莱乔
外文名 Anderson Varejao
性别 男
体重 118kg
2 中文名 博涅娃
外文名 BONEVA Antoaneta
性别 女
3 中文名 阿隆·贝内斯
外文名 Aron Baynes
性别 男
体重 118kg
dtype: object
#数据表的拼接:merge()\concat()\append()
>>> df1
中文名 外文名 性别 体重
0 阿尔法拉克·阿米奴 Al-Farouq Aminu 男 98kg
1 安德森•瓦莱乔 Anderson Varejao 男 118kg
2 博涅娃 BONEVA Antoaneta 女 NaN
>>> df2
中文名 外文名 性别 体重
6 安德烈斯·诺西奥尼 Andres Nocioni 男 102kg
7 安迪·穆雷 Andy Murray 男 81kg
8 波尔 Timo Boll 男 65kg
9 艾克内·伊贝克维 Ekene Ibekwe 男 100kg
#
pandas.merge(left=DataFrame,right=DataFrame,
how={'left','right','outer','inner','cross'}, default'inner',
'inner':将两个表主键一致的信息拼接在一起
'outer':保留两个表的所有信息,拼接时不能对齐处,用NaN填充
'left':保留左表所有信息,把右表中主键与左表一致的信息拼接进来,标签不能对齐的部分用NaN填充
'right':同上
on=None 确定作为主键的字段
left_index=False,
right_index=False,
改为True表示用左表和右表的共同索引列拼接
)
#pandas.concat()
#1.相同字段的两个表进行首尾合并
>>> pd.concat([df1,df2]{,ignore_index=True})
中文名 外文名 性别 体重
0 阿尔法拉克·阿米奴 Al-Farouq Aminu 男 98kg
1 安德森•瓦莱乔 Anderson Varejao 男 118kg
2 博涅娃 BONEVA Antoaneta 女 NaN
6 安德烈斯·诺西奥尼 Andres Nocioni 男 102kg
7 安迪·穆雷 Andy Murray 男 81kg
8 波尔 Timo Boll 男 65kg
9 艾克内·伊贝克维 Ekene Ibekwe 男 100kg
#2.列名称不一致时的横向合并,可以设置axis=1,缺失值填充NaN
#3.交叉合并,设置join='outer'取并集,join='inner'取交集,缺失值填充NaN
>>> df1=pd.DataFrame({"id":['a1','a2','a3'],"name":['Amy','Jenny','John']})
>>> df1
id name
0 a1 Amy
1 a2 Jenny
2 a3 John
>>> df2=pd.DataFrame({"id":['a1','a5'],"name":['Amy','Charle']})
>>> df2
id name
0 a1 Amy
1 a5 Charle
>>> pd.concat([df1,df2],axis=1,join='inner')
id name id name
0 a1 Amy a1 Amy
1 a5 Charle a5 Charle
>>> pd.concat([df1,df2],axis=1,join='outer')
id name id name
0 a1 Amy a1 Amy
1 a2 Jenny a5 Charle
2 a3 John NaN NaN
#append()
>>> df1._append(df2)
id name
0 a1 Amy
1 a2 Jenny
2 a3 John
0 a1 Amy
1 a5 Charle
>>> df1._append(df2,ignore_index=True)
id name
0 a1 Amy
1 a2 Jenny
2 a3 John
3 a1 Amy
4 a5 Charle
#merge():合并数据结构中的列,根据列的内容来合并
#concat():合并具有相同列的数据结构,简单地连接数据结构
2.4 数据移位
#shift()返回向下移位以后的数据
>>> df
score
0 10
1 22
2 36
>>> df.shift()
score
0 NaN
1 10.0
2 22.0