为什么需要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一样使用字典创建。:
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。
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后的结果。