为什么需要Pandas

在之前的博客中介绍了numpy,numpy已经能够帮我们去处理需要处理的数值,并且提供了各种运算方法,还可以从txt,csv中读取数据。那么pandas又有什么更大的用处呢?

pandas除了处理数值之外(基于numpy),还能够帮助我们处理其他类型的数据。并且还可以从数据库乃至剪切板读取数据。而且提供了更多集成的方法辅助我们进行运算以及统计。

Pandas中常用的数据类型分为两类,一种是Series, 一维,类似于带标签数组。另一种是DataFrame 二维,类似于Series的容器。

Series

类似于数组的创建,Series可以直接使用数组进行初始化,并且使用index参数来设置数组中元素的标签:

t=pd.Series([1,3,42,52,31,1,2])
t

结果:
0     1
1     3
2    42
3    52
4    31
5     1
6     2
dtype: int64

t=pd.Series([1,3,42,52,31,1,2],index=list("abcdefg"))
print(t)
t=pd.Series([1,3,42,52,31,1,2],index=[string.ascii_uppercase[i] for i in range(7)])
print(t)
t=t.astype(float)
print(t)

结果:
a     1
b     3
c    42
d    52
e    31
f     1
g     2
dtype: int64
A     1
B     3
C    42
D    52
E    31
F     1
G     2
dtype: int64
A     1.0
B     3.0
C    42.0
D    52.0
E    31.0
F     1.0
G     2.0
dtype: float64

类似于ndarray,Series也有dtype属性,并且可以用astype修改。同时也可以使用ndarray初始化。

因为Series中拥有标签,所以某种意义上Series其实相当于Dictionary。因此Series也可以使用Dictionary初始化:

dic={"name":"Rex","age":23,"height":181}
t=pd.Series(dic)
print(t)
print(t["age"])
print(t[1])

结果:
name      Rex
age        23
height    181
dtype: object
23
23

同时Series中元素的访问既可以用索引,也可以使用标签。

切片类似于ndarray,“:”取连续切片,“,”取不连续切片。不过由于Series只是一维,所以不需要“,”来分隔维数。

Series中可以使用values直接取值,即为一维数组。 

DataFrame

DataFrame其实就是带标签的二维数组,其中每一列都可以看做是有名字的Series。

可以用二维数组创建,也可以同Series一样使用字典创建。:

 

 

Python里将dataframe数据转换为series dataframe转化为series_python

Python里将dataframe数据转换为series dataframe转化为series_初始化_02

diclist=[{"name":"Rex","age":23,"height":181},{"name":"Zunrui","age":18,"height":178}]
t=pd.DataFrame(dic)
print(t)

结果:
     name  age  height
0     Rex   23     181
1  Zunrui   18     178


dic={"name":["Rex","Zunrui","Alice","Bob"],"age":[23,18,35,28],"height":[181,178,161,175]}
t=pd.DataFrame(dic)
print(t)

结果:
     name  age  height
0     Rex   23     181
1  Zunrui   18     178
2   Alice   35     161
3     Bob   28     175

Series是每一个元素都有标签,DataFrame是二维的,每一行都有行标签,参数为index,每一列也有标签,参数为columns。

Python里将dataframe数据转换为series dataframe转化为series_python_03

DataFrame可以根据某一行来进行排序:

DataFrame.sort_values(by=‘##’,axis=0,ascending=True, inplace=False, na_position=‘last’)

参数

含义

by

指定列名(axis=0或’index’)或索引值(axis=1或’columns’)

axis

若axis=0或’index’,则按照指定列中数据大小排序;若axis=1或’columns’,则按照指定索引中数据大小排序,默认axis=0

ascending

是否按指定列的数组升序排列,默认为True,即升序排列

inplace

是否用排序后的数据集替换原来的数据,默认为False,即不替换

na_position

{‘first’,‘last’},设定缺失值的显示位置

关于切片索引,DataFrame可以使用类似ndarray的方法直接通过索引访问。同时Pandas还提供的loc以及iloc的方法辅助访问。

df.loc通过标签索引行数据

df.iloc则通过位置获取行数据

具体操作等同于ndarray的切片索引方式。需要注意的是在loc中:是左闭右闭的,即冒号前后的数据都会被访问,而一般切片索引中:是左闭右开的,不会选择到冒号后面的数据。

关于Nan

Pandas对于Nan的处理集成了比较多的方法,对比numpy实在是方便很多。

判断数据是否为NaN:   pd.isnull(df),pd.notnull(df)
处理方式1:删除NaN所在的行列dropna (axis=0, how='any', inplace=False)
处理方式2:填充数据,t.fillna(t.mean()),t.fiallna(t.median()),t.fillna(0)
处理为0的数据:t[t==0]=np.nan

当然并不是每次为0的数据都需要处理 计算平均值等情况,nan是不参与计算的,但是0会。之前在numpy的总结中是不能直接使用类似.mean()的,因为在numpy中,一旦nan在数据中参与运算,结果会直接显示为nan,而pandas中则会直接跳过,不需要更复杂的处理来计算去除nan后的结果。