python之padnas学习(四)

匿名 (未验证) 提交于 2019-12-02 22:11:45

A.整数索引:

用整数索引在pandas中 与python的list与truple有一点不同,如果在Series的默认row Index为数字的话,用整数索引会出错,那么我们就应该将index更改掉,改成其它。

 1. import numpy as np import pandas as pd  obj=pd.Series(np.arange(3.)) print(obj)

print(obj[-1])

看得出来如果这样会报错!

因为在我们创建Series的时候index 为0,1,2 .而我们obj[-1] 表达的意思和它起冲突了,所以程序想知道我们想要什么就困难。我们需要的倒数第一个,而它以为我们是要index为-1的这个数据,所以就会报错。那么我们创建时将index更改掉,那么就可以了!

 obj1=pd.Series(np.arange(3.),index=['a','b','c']) print(obj1[-1])

2.

其实也可以这样索引,从输出中看出每个的不同,这里我用的是创建的第一个对象obj,不是obj1

 print(obj[:1]) print(obj.loc[:1]) print(obj.iloc[:1])

B.算数与数据对齐:

padnas一个特点是,两个相同的数据结构相加,那么他们的索引值对应相加,如果这两个,其中一个有不同的index,那么相加后,这个index的数值就会被标记为缺失值NaN。所以这种对齐方式会引入很多缺失值,这些缺失值也会运用到以后的计算中

代码:

 s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index=['a', 'c', 'd', 'e']) s2 = pd.Series([2.1, 3.6, -1.5, 4, 3.1], index=['a', 'c', 'e', 'f', 'g']) print(s1) print(s2) print(s1+s2)

 df1 = pd.DataFrame(np.arange(9.).reshape((3, 3)), columns=list('bcd'),                    index=['Ohio', 'Texas', 'Colorado']) df2 = pd.DataFrame(np.arange(12.).reshape((4, 3)), columns=list('bde'),                    index=['Utah', 'Ohio', 'Texas', 'Oregon']) print(df1) print(df2) 

还要记住如果一个缺失值与一个数值对齐,那么在重新组合的DataFrame 或则Series 的中的值为缺失值NaN,如:

 df1 = pd.DataFrame(np.arange(12.).reshape((3, 4)),                     columns=list('abcd')) df2 = pd.DataFrame(np.arange(20.).reshape((4, 5)),                     columns=list('abcde')) df2.loc[1, 'b'] = np.nan 

第3行代码我将df2的第1行第b列的数值变为了NaN

print(df1+df2)

如果使用fill_value,那么将不会出现缺失值,就相当于加两个数据集合并,取并集而不是像上面取交集

print(df1.add(df2,fill_value=0))

1除以df1,也可以使用df1.rdiv(1)

print(1/df1)

print(df1.rdiv(1))

重建索引中也可以使用fill_value,重建索引使用方法reindex()

df1.reindex(columns=df2.columns,fill_value=0)

C.DataFrame与Series之间的操作

1.

我们先看一下numpy的例子:

 arr=np.arange(12.).reshape((3,4)) print(arr) print(arr-arr[0])

从结果可以看得出,用arr的每一行去减去arr的第一行arr[0],DataFrame和Series都也有这种操作

 frame = pd.DataFrame(np.arange(12.).reshape((4, 3)),                      columns=list('bde'),                     index=['Utah', 'Ohio', 'Texas', 'Oregon']) series = frame.iloc[0]

输出:

frame:





seires:



frame-series:

#series的index 去匹配frame的列,然后逐行减去series






如果frame + series ,那么取合集,然后series中的index 在frame中没有相应的列对应,frame中的列,series中没有相应的对应。那么就变为NaN

 series2=pd.Series(np.arange(3.),index=['b','d','f']) print(series2+frame)     b     d   e   f Utah    0.0   2.0 NaN NaN Ohio    3.0   5.0 NaN NaN Texas   6.0   8.0 NaN NaN Oregon  9.0  11.0 NaN NaN

上面用到的是用series 广播行(逐行)去匹配列

下面是广播列去匹配行(rows index)

 series3=frame['d'] print(series3) #输出: Utah       1.0 Ohio       4.0 Texas      7.0 Oregon    10.0 Name: d, dtype: float64  #我们使用: print(frame.sub(series3,axis='index')) #输出:  b    d    e Utah   -1.0  0.0  1.0 Ohio   -1.0  0.0  1.0 Texas  -1.0  0.0  1.0 Oregon -1.0  0.0  1.0  #这里我们用的是frame的sub方法,参数就传入要匹配的series3,还要就是需要怎样匹配,axis=‘index’ or axis=0代表的匹配row index ,如果axis=‘columns’ or axis=1代表匹配frame的列 

D.函数应用和映射

1.

还有就是产生随机数,np.random.randn(3,4) #产生3*4的随机数矩阵

np.random.randint(0,10,size=(3,4)) #产生指定范围的随机数,数值是整数。

 frame=pd.DataFrame(np.random.rand(4,3), index=['Utah', 'Ohio', 'Texas', 'Oregon'],columns=list('bde')) print(frame) #输出:                    b         d         e Utah    0.297399 -0.739661  0.559333 Ohio    2.392562 -0.973815  0.717069 Texas  -2.025912 -0.732833  1.562608 Oregon -1.329397 -2.241431 -0.457382  np.abs(frame)  可以将DataFrame中的负数改为正数,abs()绝对值函数,和其它语言的函数相同            b         d         e Utah    0.297399  0.739661  0.559333 Ohio    2.392562  0.973815  0.717069 Texas   2.025912  0.732833  1.562608 Oregon  1.329397  2.241431  0.457382  

2.

apply() ,参数为定义的一个函数f。 就是我们可以利用apply()来将用到一维数组上的函数用在DataFrame的行或列上

 f=lambda x :x.max() - x.min() #这里我们定义了一个f函数,计算x的最大值和最小值的差 print(frame1)   print(frame1.apply(f)) #输出:                b         d         e Utah    0.447511  0.243971 -0.091712 Ohio    0.324407  1.456428 -0.195983 Texas  -0.314323  1.770854  0.798907 Oregon -1.253118  1.921829  2.750600 b    1.700629 d    1.677859 e    2.946583 dtype: float64  #现在讲解一下apply()函数,它将f用于DataFrame的每一列,计算每一列的最大值与最小值 #之间的差,将结果返回给对应得Series,Series的index 为DataFrame对应的列index  #计算DataFrame的行呢,这里我们就传入给apply传入参数中加上axis='columns'  print(frame.apply(f,axis='columns')) Utah      0.782384 Ohio      2.275816 Texas     1.946597 Oregon    0.973999  

apply()不会返回标量,只返回一个含有多个值的Series

像sum,mean这些数组统计方法,DataFrame中已经存在,所以不需用apply()

比如我们再定义一个函数:

 def f(x):     return pd.Series([x.max(),x.min()],index=['max','min'])  print(frame1.apply(f))  #输出:             b         d         e max  1.784617  1.979622  0.797483 min -0.946834 -0.076893 -2.294097 

如果想对DataFrame中的每个数据进行格式化,那么就采用applymap()。

 #对DataFrame中的数据保留两位小数 fr=lambda x: '%.2f' %x print(frame1.applymap(fr))  #输出:            b      d      e Utah    -0.90  -0.95   2.05 Ohio     0.91   0.58   1.28 Texas    0.58   0.62   0.90 Oregon   0.38  -0.65  -0.46 

applymap的做法是,series有一个map函数,能用来实现所写函数,因为其实我们是在对每个Series进行函数操作

 print(frame1['e'].map(fr))  #输出:  Utah      1.62 Ohio      0.59 Texas     0.63 Oregon    0.37 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!