Pandas数据结构介绍 Series Series介绍 Series是 一种一维的数组型对象 ,它包含了一个值序列(values)**,并且包含了数据标签,称为 索引(index)**。
Series创建 pd.Series(data=None,index=None,dtype=None,name=None,copy=False)
data:创建数组的数据,可为array-like, dict, or scalar value
index:指定索引
dtype:数组数据类型
name:数组名称
copy:是否拷贝
data可为iterable, dict, or scalar value索引默认为range(0,n) 可以通过index指定索引
1 2 3 4 5 6 7 8 9 10 11 12 13 import pandas as pdimport numpy as nps1 = pd.Series([1 ,2 ,3 ,4 ,5 ],index=list('abcde' )) print(s1)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import pandas as pdimport numpy as npdic = { 'name' :'sansan' , 'age' :18 } s2 = pd.Series(dic) print(s2) idex = ['class' ,'age' ] print(pd.Series(dic,index=idex))
数据类型根据data自动调整,但是也可以通过dtype指定
1 2 3 4 5 6 7 8 9 10 11 12 import pandas as pdimport numpy as nps3 = pd.Series(np.arange(7 ),dtype='float' ) print(s3)
使用name参数设置数组名称
1 2 3 4 5 6 7 8 9 import pandas as pdimport numpy as nps4 = pd.Series(np.random.randint(1 ,10 ,size=3 ),index= list('abc' ),name='Sansan' ) print(s4)
除此之外,Pandas可以使用Numpy的数组函数。
s.dtype # 查看数据类型
s.astype() # 修改数据类型
s.head(n) # 预览数据前5条
s.tail(n) # 预览数据后5条
但是如果需要显示所有数据,则需以下代码。但并不建议使用
1 2 3 4 5 6 7 8 pd.set_option('display.max_columns' , None ) pd.set_option('display.max_rows' , None ) pd.set_option('max_colwidth' ,100 )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import pandas as pdimport numpy as nps5 = pd.Series(np.random.randint(1 ,100 ,size=100 )) print(s5.head()) print(s5.tail())
series的索引与值
Series索引与切片
s[‘标签’] # 通过标签
s[‘索引’] # 通过索引
s.loc(标签) # 通过标签
s.iloc(索引) # 通过索引
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import pandas as pdimport numpy as nps1 = pd.Series(range(1 ,5 )) print(s1.index,s1.values) s2 = pd.Series(range(5 ),index=list('abcde' )) print(s2['b' ]) print(s2.loc['b' ]) print(s2[1 ]) print(s2.iloc[1 ]) s2['c' ] = 5 s2[1 ] = 10 print(s2) print(s2[:3 ]) print(s2['a' :'c' ]) print(s2[s2>4 ])
Series运算
共同索引对应为运算,其它填充NaN
没有共同索引时,则全部为NaN
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 import pandas as pds2 = pd.Series(range(3 ),index=range(3 )) s3 = pd.Series(range(4 ,7 ),index=range(3 )) print(s2+s3) s4 = pd.Series(range(5 ,11 ),index=range(6 )) print(s2+s4) s5 = pd.Series(range(5 ,8 ),index=range(3 ,6 )) print(s2+s5)
DataFrame DataFrame介绍 DataFrame 表示的是矩阵的数据表,它包含已排序的列集合,每一列可以是不同的值类型(数值,字符串,布尔值)。在DataFrame中,数据被存储为一个以上的二维块。
DataFrame创建 pd.DataFrame(data=None,index=None,columns=None,dtype=None,copy=False)
data:创建数组的数据,可为ndarray, dict
index:指定索引
dtype:数组数据类型
copy:是否拷贝
1 2 3 4 5 6 7 8 9 10 11 12 13 14 import pandas as pdimport numpy as npdata = [ {'name' :'sansan' ,'age' :18 ,'lesson' :'python' }, {'name' :'bude' ,'age' :20 ,'lesson' :'Java' }, {'name' :'jiu' ,'age' :22 ,'lesson' :'C++' } ] s1 = pd.DataFrame(data,index=list('abc' )) print(s1)
重置索引 除了创建时可以指定,我们创建后还可以通过df.reindex()进行重置索引。
df**.**reindex(index=None, columns=None, axis=None,fill_value=nan)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import pandas as pdimport numpy as npdf = pd.DataFrame(np.arange(9 ).reshape(3 ,3 ),index=list('abc' ),columns=list('ABC' )) print(df) print(df.reindex([1 ,2 ,3 ])) print(df.reindex(['b' ,'a' ,'c' ]))
1 2 3 4 5 6 7 8 9 import pandas as pdimport numpy as npprint(df.reindex(columns=list('BCA' ))) print(df.reindex(index=list('cba' ),columns=list('CBA' ))) print(df.reindex(index=list('cbad' ),columns=list('CBA' ))) print(df.reindex(index=list('cbad' ),columns=list('CBA' ),fill_value=0 ))
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 A B C b 3 4 5 a 0 1 2 c 6 7 8 B C A a 1 2 0 b 4 5 3 c 7 8 6 C B A c 8 7 6 b 5 4 3 a 2 1 0 C B A c 8.0 7.0 6.0 b 5.0 4.0 3.0 a 2.0 1.0 0.0 d NaN NaN NaN C B A c 8 7 6 b 5 4 3 a 2 1 0 d 0 0 0
DataFrame基础操作
df.shape # 查看数组形状,返回值为元组
df.dtypes # 查看列数据类型
df.ndim # 数据维度,返回为整数
df.index # 行索引
df.columns # 列索引
df.values # 值
d.head(n) # 显示头部几行,默认前5行
d.tail(n) # 显示末尾几行,默认后5行
d.info() # 相关信息概述
1 2 3 4 5 6 7 8 9 10 11 12 13 data = [ {"name" :"amy" ,"age" :18 ,"tel" :10086 }, {"name" :"bob" ,"age" :18 }, {"name" :"james" ,"tel" :10086 }, {"name" :"zs" ,"tel" :10086 }, {"name" :"james" ,"tel" :10086 }, {"name" :"ls" ,"tel" :10086 }, ] d2 = pd.DataFrame(data) d2.head() d2.tail() d2.info()
DataFrame查数据(索引与切片) 直接使用索引与标签:
类型
描述
df[:索引]或df[:”标签”]
表示对行操作
df[“列标签”]或 df[[“列标签”,”列标签”]]
表示对列进行操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import pandas as pdimport numpy as npdata2 = [ {'name' :'sansan' ,'age' :18 ,'lesson' :'python' }, {'name' :'bude' ,'age' :20 ,'lesson' :'Java' }, {'name' :'jiu' ,'age' :22 ,'lesson' :'C++' }, {'name' : 'sansan' , 'age' : 18 , 'lesson' : 'python' }, {'name' : 'bude' , 'age' : 20 , 'lesson' : 'Java' }, {'name' : 'jiu' , 'age' : 22 , 'lesson' : 'C++' }, ] s1 = pd.DataFrame(data2,index=list('abcdef' )) print(s1[:2 ]) print(s1[:'b' ]) print(s1['name' ]) print(s1[['name' ,'age' ]]) print(s1.name) print(s1[:2 ]['name' ]) print(s1.name[:2 ]) print(s1[s1.name != 'jiu' ])
1 2 3 4 5 6 7 name age lesson a sansan 18 python b bude 20 Java c jiu 22 C++ d sansan 18 python e bude 20 Java f jiu 22 C++
1 2 3 s2 = pd.DataFrame(np.arange(16 ).reshape(4 ,4 ),columns=list('ABCD' )) print(s2[s2>5 ])
1 2 3 4 5 A B C D 0 NaN NaN NaN NaN1 NaN NaN 6.0 7.0 2 8.0 9.0 10.0 11.0 3 12.0 13.0 14.0 15.0
使用loc及loc查询数据:
df.loc[] 通过轴标签 选择数据
df.iloc[] 通过整数索引 选择数据
类型
描述
df.loc[val]
根据标签索引选择DataFrame的单行或多行
df.loc[:,val]
根据标签索引选择DataFrame的单列或多列
df.loc[val1,val2]
同时选择行和列中的一部分
df.iloc[where]
根据位置索引选择DataFrame的单行或多行
df.iloc[:,where]
根据位置索引选择DataFrame的单列或多列
df.iloc[where_i,where_j]
根据位置索引选择行和列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 s3 = pd.DataFrame(np.arange(16 ).reshape(4 ,4 ),index=['PHP' ,'JAVA' ,'C++' ,'Python' ],columns=list('ABCD' )) print(s3.loc['Python' ,:]) print(s3.loc['Python' ]) print(s3.loc[:,'C' ]) print(s3.loc[['PHP' ,'C++' ],:]) print(s3.loc[:,['A' ,'C' ]]) print(s3.loc['PHP' :'C++' ,:]) print(s3.loc[:,'A' :'C' ]) print(s3.iloc[2 ]) print(s3.iloc[:2 ]) print(s3.iloc[:,1 :3 ]) print(s3.iloc[[0 ,3 ],:]) print(s3.iloc[:,[0 ,3 ]]) print(s3.iloc[:,:3 ][s3.C>5 ])
DataFrame修改数据 修改数据主要遵循以下两点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 import pandas as pdimport numpy as nps3 = pd.DataFrame(np.arange(16 ).reshape(4 ,4 ),index=['PHP' ,'JAVA' ,'C++' ,'Python' ],columns=list('ABCD' )) s3.loc['PHP' ] = 8 print(s3) s3.loc[:,'C' ] = 9 print(s3) s3.loc['Python' ,'B' ] = 20 print(s3) s3.loc['C++' ,'B' ] = None print(s3)
注意
Pandas中可以直接赋值np.nan,且赋值当前列数据会自动转为浮点类型。而不是整个数组都转,这主要是因为Pandas数据可以是异质性。
DataFrame新增数据 新增列: df[“新的列标签”] = 值
注意:添加列,则新添加的值的长度必须与其它列的长度保持一致,否则会报错。
插入列: 如果需要在数据中插入列,则使用 df.insert(loc, column, value)
loc 为插入列的位置
column 为插入列的标签
value 为插入列的值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import pandas as pdimport numpy as nps3 = pd.DataFrame(np.arange(16 ).reshape(4 ,4 ),index=['PHP' ,'JAVA' ,'C++' ,'Python' ],columns=list('ABCD' )) s3.loc['PHP' ] = 8 print(s3) s3.loc[:,'C' ] = 9 print(s3) s3.loc['Python' ,'B' ] = 20 print(s3) s3.loc['C++' ,'B' ] = None print(s3) s3['E' ] = 10 print(s3) s3.insert(1 ,'F' ,[4 ,5 ,6 ,7 ]) print(s3)
添加行: df.loc[“新的行标签”,:] = 值
除此之外,我们还可以通过 df.append(df2)
方法添加行,但类似于数组与数组的堆叠拼接。所以df2的列索引必须同df一致。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import pandas as pdimport numpy as nps3 = pd.DataFrame(np.arange(16 ).reshape(4 ,4 ),index=['PHP' ,'JAVA' ,'C++' ,'Python' ],columns=list('ABCD' )) s3.loc['PHP' ] = 8 print(s3) s3.loc[:,'C' ] = 9 print(s3) s3.loc['Python' ,'B' ] = 20 print(s3) s3.loc['C++' ,'B' ] = None print(s3) s3['E' ] = 10 print(s3) s3.insert(1 ,'F' ,[4 ,5 ,6 ,7 ]) print(s3) s4 = s3.append(s3) print(s4)
DataFrame删除数据 法1:del df[“列标签”]
法2:df.drop(axis=0,index =None,columns =None,inplace=False)
1 2 3 4 5 6 7 8 9 10 11 12 13 import pandas as pdimport numpy as nps3 = pd.DataFrame(np.arange(16 ).reshape(4 ,4 ),index=['PHP' ,'JAVA' ,'C++' ,'Python' ],columns=list('ABCD' )) del s3['C' ]print(s3) s5 = s3.drop(columns='B' ) s6 = s3.drop(index='PHP' ) print(s5) print(s6) s3.drop('A' ,axis=1 ,inplace=True ) print(s3)
DataFrame算术 实际上,通过 + - * / // **
等符号可以直接对DataFrame与DataFrame之间 或者DataFrame以及Series之间 进行运算。但秉承的原则就是对应索引运算,存在索引不同时,返回结果为索引对的并集。
但是实际操作会发现,当存在索引不同时,返回的值自动填充NaN。
使用填充值的算术方法
方法
描述
add
加法(+)
sub
减法(-)
div
除法(/)
floordiv
整除(//)
mul
乘法(*)
pow
幂次方(**)
注意
描述性统计的概述和计算
方法
描述
count
非NA值的个数
min,max
最小值,最大值
idxmin,idxmax
最小值,最大值的标签索引
sum
求和
mean
平均值
median
中位数
var
方差
std
标准差
cumsum
累计值
cummin,cummax
累计值的最小值或最大值
cumprod
值的累计积
diff
计算第一个算术差值(时间序列)
pct_change
百分比
corr
按索引对其的值的相关性
cov
协方差
DataFrame排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ``` Row_Labels Count_AnimalName - 1156 BELLA 1195 9140 MAX 1153 2660 CHARLIE 856 3251 COCO 852 12368 ROCKY 823 ... ... ... 6884 J-LO 1 6888 JOANN 1 6890 JOAO 1 6891 JOAQUIN 1 16219 39743 1 [16220 rows x 2 columns]
```
注意
by = [col1,col2] 是先给col1排序 当col1有相同值时,col2中按排序顺序再排序
函数应用于映射
df.apply(func, axis=0) # 通过 apply 将函数运用到列 或者 行
df.applymap(func) # applymap将函数应用到每个数据上