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