扫二维码下载作业帮
3亿+用户的选择
下载作业帮安装包
扫二维码下载作业帮
3亿+用户的选择
1.求等差数列1,6,11,16…的第20项是多少?第35项是多少?251是这个等差数列的第几项?2、已知等差数列2,5,8,11,14…,问47是其中第几项?3、如果一等差数列的第4项为21,第6项为33,求它的第8项.4、已知等差数列的公差为4,末项为280,数列共25项,这个数列的首项是多这个数列的第16项是多少?5、小剧场共有40排座位,每一排都比前一排多2个座位,最后一排有120个座位,第一排有多少个座位?第25排有多少个座位?
作业帮用户
扫二维码下载作业帮
3亿+用户的选择
1.公差为5;第20项为(20-1)*5+1=96;第35项为(35-1)*5+1=171;251是第((251-1)/5)+1=51 项2.公差为3;47是第((47-2)/3)+1=16项3.公差为(33-21)/(6-4)=6;第8项为33+(8-6)*6=45;也可直接由33+(33-21)得出4.令首项为x,则x+(25-1)*4=280,得首项为184;第16项为184+(16-1)*4=244;5.公差为2,项数为40,末项为120,则令首项为x,有x+(40-1)*2=120,得首项为42;第25排有座位 42+(25-1)*2=90个
为您推荐:
其他类似问题
1. 表达式为 5(n-1)+1
第20项是5(20-1)+1=96
第35项是5(35-1)+1=171
5(n-1)+1 =251
即251是这个等差数列的第24项2.
表达式为3n-1
即47是其中第16项3. 公差为(33-21)/(6-4)=6
第8项为33+6+6=45...
1、因为(6-1)=5,则20*5-4=96;35*5-4=171;251*5-4=12512、困为(5-2)=3;则(47+1)/3=163、(33-21)+33=454、首项+4*24=280,则首项=184,首项+4*15=184+60=2445、首排+2*39=120,首排=42;首排+2*24=42+48=90
呵呵,等差数列是有公式的~~~~可能你们还不知道An=A1+(n-1)d
(n是第n项,d是公差,就是每二个之间的差值。An就是第n项那个数)所以解法:1。等差数列1,6,11,16…
可以知道A1=1
即An=1+(n-1)5 = 5n-4所以(1)第20项,即n=20 , 0]
dtype: int64
In [19]: obj2 * 2
dtype: int64
In [20]: np.exp(obj2)
403.428793
dtype: float64
通过python字典直接创建Series
In [21]: sdata = {'Ohio':2000, 'Texas':3000, 'Utah':3425, 'Oregon':3908}
In [22]: obj3 = pd.Series(sdata)
In [23]: obj3
dtype: int64
In [24]: obj3.values
Out[24]: array([, ])
In [25]: obj3.index
Out[25]: Index([u'Ohio', u'Oregon', u'Texas', u'Utah'], dtype='object')
如果只传入一个字典,则结果中的索引就是按照原字典的键(有序排列)
如果传入的index 列表中的元素和字典中的键相互匹配不到,则该索引位置的values 为NaN
n [26]: states = ['california','Ohio','Oregon','Texas']
In [27]: obj4 = pd.Series(sdata,index = states)
In [28]: obj4
california
dtype: float64
pandas 的isnull 和notnull 函数可以用于检测缺失数据
In [34]: obj4.isnull()
california
dtype: bool
In [35]: obj4.notnull()
california
dtype: bool
Series 一个重要的功能是:它在运算中会自动对齐不同索引的数据
In [36]: obj3
dtype: int64
In [37]: obj4
california
dtype: float64
In [38]: obj3 + obj4
california
dtype: float64
Series 对象本身 及其索引都有一个name 属性Series 的索引可以通过赋值的方式就地修改
In [40]: obj4.name = 'population'
In [41]: obj4.index.name = 'state'
In [42]: obj4
california
Name: population, dtype: float64
In [43]: obj
dtype: int64
In [45]: obj.index = ['a','b','c','d']
In [46]: obj
dtype: int64
(2)DataFrame
DataFrame 是一个表格型的数据结构,每列可以是不同的值类型(数值,字符串,布尔值)。DataFrame 可以被看做由Series组成的字典(共用同一个索引)通过字典创建DataFrame:每一columns对应的是字典中每个key - value 对,有index 行
In [16]: data = {'state':['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year':[, , 2004],
'pop':[1.5, 1.7, 3.6, 2.4, 2.9]}
In [17]: data
{'pop': [1.5, 1.7, 3.6, 2.4, 2.9],
'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [, , 2004]}
In [18]: frame01 = pd.DataFrame(data,columns = ['year','state','pop'],index = ['1','2','3','4','5'])
In [19]: frame01
如何指定了列序列,则DataFrame的列就会按照制定顺序进行排序和Series 一样,如果传入的列在数据中找不到,就会产生NA值
获取列,获得的是一个series
In [31]: frame01['year']
Name: year, dtype: int64
In [32]: frame01['pop']
Name: pop, dtype: float64
In [33]: frame01.state
Name: state, dtype: object
行可以通过索引字段ix获取
In [5]: frame01.ix[1]
Name: 2, dtype: object
In [6]: frame01.ix['1']
Name: 1, dtype: object
列的索引依然为DataFrame 的索引
In [35]: frame02
In [36]: frame02.state
Name: state, dtype: object
In [37]: frame02.year
Name: year, dtype: int64
列可以通过赋值的方式进行修改将列表或数组赋值给某个列时,其长度必须和DataFrame的长度相匹配如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都将被填上缺失值
In [22]: frame
state year pop
In [23]: frame.year = np.arange()
In [24]: frame.pop = np.random.randn(5)
In [25]: frame
In [40]: frame
state year pop debt
In [41]: val = pd.Series([-1.2,-1.5,-1.7], index = ['two', 'four', 'five'])
In [42]: frame['dedt'] = val
In [43]: frame
state year pop debt
In [44]: frame['newline'] = frame.state != 'Ohio'
In [45]: frame
state year pop debt
dedt newline
In [46]: del frame['newline']
In [47]: frame
state year pop debt
(1)DataFrame的index 和 columns 的 name 属性
In [69]: frame.columns.name = 'state'
In [70]: frame.index.name = 'myname'
In [71]: frame.columns.name = 'state'
In [72]: frame
state year pop debt
(2)values 属性也会以二维ndarray 的形式返回DataFrame 中的数据
In [73]: frame.values
array([['Ohio', '1', '1', nan, nan],
['Ohio', '1', '1', nan, -1.2],
['Ohio', '1', '1', nan, nan],
['Nevada', '1', '1', nan, -1.5],
['Nevada', '1', '1', nan, -1.7]], dtype=object)
(3)可以输入给DataFrame构造器的数据
(3)索引对象
pandas 的索引对象负责管理轴标签和其他元数据(比如轴名称)
n [4]: obj = pd.Series(range(3),index=['a','b','c'])
In [5]: obj
dtype: int64
In [6]: index = obj.index
In [7]: index
Out[7]: Index([u'a', u'b', u'c'], dtype='object')
In [8]: index[1:]
Out[8]: Index([u'b', u'c'], dtype='object')
In [9]: index[
Index 对象是不可以修改的不可修改性很重要,因为这样才能使Index对象在多个数据结构之间安全共享
n [4]: obj = pd.Series(range(3),index=['a','b','c'])
In [5]: obj
dtype: int64
In [6]: index = obj.index
In [7]: index
Out[7]: Index([u'a', u'b', u'c'], dtype='object')
In [8]: index[1:]
Out[8]: Index([u'b', u'c'], dtype='object')
In [42]: index
Out[42]: Index([u'a', u'b', u'c'], dtype='object')
In [43]: obj2 = pd.Series(range(3),index = index)
In [44]: obj2.index
obj2.index
In [44]: obj2.index is index
Out[44]: True
In [45]: index
Out[45]: Index([u'a', u'b', u'c'], dtype='object')
In [46]: obj2 = pd.Series(range(3),index = index)
In [47]: obj2.index is index
Out[47]: True
中的对象包含三要素:id、type、value
其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值
is判断的是a对象是否就是b对象,是通过id来判断的
==判断的是a对象的值是否和b对象的值相等,是通过value来判断的
In [48]: index2=index
In [49]: index2
Out[49]: Index([u'a', u'b', u'c'], dtype='object')
In [50]: obj2.index is index2
Out[50]: True
In [51]: index3 = ['a','b','c']
In [52]: index3 is index
Out[52]: False
In [53]: obj2.index is index3
Out[53]: False
pandas中主要的Index对象
Index的功能也类似一个固定大小的集合
In [28]: frame
In [29]: 'Ohio' in frame.columns
Out[29]: True
In [30]: 2002 in frame.index
Out[30]: True
In [31]: 1999 in frame.index
Out[31]: False
Index的方法和属性
pandas数据处理基本方法:
(1)重新索引
pandas对象的一个重要的方法是reindex,其作用是创建一个适应新索引的新对象调用Series 的 reindex 将会根据新索引进行重排,如果某个索引值当前不存在,就引入缺失值
In [38]: obj = pd.Series([4.5,7.2,-5.3,3.8], index = ['d','b','a','c'])
In [39]: obj
dtype: float64
In [40]: obj2 = obj.reindex(['a','b','c','d','e'])
In [41]: obj2
dtype: float64
为了防止索引值不存在的情况可以用 fill_value 值来设置无索引的默认值
In [42]: obj2 = obj.reindex(['a','b','c','d','e'],fill_value = 0)
In [43]: obj2
dtype: float64
对于时间序列这样的有序数据,重新索引时可以需要做一些插值操作处理,method选项即可达到此目的ffill可以实现向前值填充
In [44]: obj3 = pd.Series(['blue','purple','yellow'],index=[0,2,4])
In [45]: obj3.reindex(range(6),method='ffill')
dtype: object
reindex的(插值)method选项
对于DataFrame,reindex可以修改(行)索引,列,或两个都修改如果仅仅传入一个序列,则会重新索引行
In [47]: frame = pd.DataFrame(np.arange(9).reshape((3,3)),index=['a','c','d'],
....: columns=['Ohio','Texas','California'])
In [48]: frame
California
In [49]: frame2 = frame.reindex(['a','b','c','d'])
In [50]: frame2
California
In [51]: states = ['Texas','Utah','California']
In [52]: frame.reindex(columns=states)
California
对行和列同时进行索引,而插值则只能按行应用(即轴0)
In [54]: frame.reindex(index=['a','b','c','d'],method = 'ffill',
....: columns = states)
California
利用ix的标签索引功能索引
In [56]: frame.ix[['a','c'],'Texas']
Name: Texas, dtype: int64
reindex函数的参数
(2)丢弃指定轴上的项
drop方法返回的是一个在指定轴上删除了指定值的新对象
In [58]: obj = pd.Series(np.arange(5.),index=['a','b','c','d','e'])
In [59]: new_obj = obj.drop('c')
In [60]: obj
dtype: float64
In [61]: new_obj
dtype: float64
DataFrame可以删除任意轴上的索引值
In [68]: data = pd.DataFrame(np.arange(16).reshape((4,4)),index=['Ohio','Colorado','Utah','New York'],
columns=['one','two','three','four'])
In [69]: data
In [70]: data.drop(['Colorado','Ohio'])
In [71]: data.drop('two',axis=1)
In [72]: data.drop(['one','four'],axis=1)
(3)索引、选取和过滤
Series 索引工作方式类似与numpy数组的索引,只不过Series的索引值不只是整数
In [3]: obj = pd.Series(np.arange(4.),index=['a','b','c','d'])
In [4]: obj
dtype: float64
In [5]: obj['b']
Out[5]: 1.0
In [6]: obj[1]
Out[6]: 1.0
In [7]: obj[2:4]
dtype: float64
In [8]: obj[['b','d']]
dtype: float64
In [9]: obj[['1','3']]
dtype: float64
In [10]: obj[[1,3]]
dtype: float64
In [11]: obj[obj<2]
dtype: float64
利用标签的切片运算与普通的python切片运算不同,其末端是包含的,而普通的切片不包含
In [18]: obj[0:3]
dtype: float64
In [19]: obj['a':'d']
dtype: float64
切片赋值
In [21]: obj['a':'c'] = 1
In [22]: obj
dtype: float64
对DataFrame进行索引就是获取一个或多个列索引方式有几个特殊的情况。首先通过切片或布尔型数组选取行
In [24]: data = pd.DataFrame(np.arange(16).reshape((4,4)),index = ['Ohio','Colorado','Utah','New York'],
....: columns=['one','two','three','four'])
In [25]: data
[4 rows x 4 columns]
In [26]: data[:2]
[2 rows x 4 columns]
In [27]: data[data['three'] > 5]
[3 rows x 4 columns]
上面那种方式比较不符合逻辑,毕竟来源于实践另一种方式可以通过布尔型DataFrame来进行索引
In [38]: data < 5
[4 rows x 4 columns]
In [39]: data[data < 5] = 0
In [40]: data
[4 rows x 4 columns]
使用ix专门的索引字段
In [44]: data.ix['Colorado',['tow','three']]
Name: Colorado, dtype: float64
In [45]: data.ix['Colorado',['two','three']]
Name: Colorado, dtype: int64
In [46]: data.ix[['Colorado','Utah'],[3,1,0]]
[2 rows x 3 columns]
In [47]: data.ix[2]
Name: Utah, dtype: int64
In [48]: data.ix[:'Utah','two']
Name: two, dtype: int64
In [49]: data.ix[data.three > 5,:3]
[3 rows x 3 columns]
DataFrame的索引选项:
(4)算数运算和数据对齐
pandas最重要的一个功能是可以对不同索引值的对象进行算数运算。如果存在不同的索引对,则结果的索引就是该索引对的并集
In [51]: s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index = ['a','c','d','e'])
In [52]: s2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1], index = ['a','c','e','f','g'])
In [53]: s1
dtype: float64
In [54]: s2
dtype: float64
In [55]: s1 + s2
dtype: float64
对于DataFrame,对齐操作会同时发生在行和列上
In [61]: df1 = pd.DataFrame(np.arange(9.).reshape((3,3)),columns=list('bcd'),
index = ['Ohio','Texas','Colorado'])
In [62]: df2 = pd.DataFrame(np.arange(12.).reshape((4,3)),columns=list('bde'),
index = ['Utah','Ohio','Texas','Oregon'])
In [63]: df1
[3 rows x 3 columns]
In [64]: df2
[4 rows x 3 columns]
In [65]: df1 + df2
Colorado NaN NaN NaN NaN
NaN NaN NaN NaN
NaN NaN NaN NaN
[5 rows x 4 columns]
4.1 在算数方法中填充值
在对不同索引对象进行算数运算时,你可能希望当一个对象中某个轴标签在另一个对象中找不到时填充一个特殊值
In [66]: df1 = pd.DataFrame(np.arange(12.).reshape((3,4)),columns=list('abcd'))
In [67]: df2 = pd.DataFrame(np.arange(20.).reshape((4,5)),columns=list('abcde'))
In [68]: df1 + df2
3 NaN NaN NaN NaN NaN
[4 rows x 5 columns]
In [69]: df1.add(df2,fill_value=0)
[4 rows x 5 columns]
与此类似,Series 或 DataFrame 重新索引时,也可以指定一个填充值
In [72]: df1.reindex(columns=df2.columns,fill_value=0)
[3 rows x 5 columns]
4.2 DataFrame和Series之间的运算
先来计算一个二维数组与其某行之间的差这样的运算叫做广播
In [73]: arr = np.arange(12.).reshape((3,4))
In [74]: arr
In [75]: arr[0]
Out[75]: array([ 0.,
In [76]: array([0.,1.,2.,3.])
Out[76]: array([ 0.,
In [77]: arr - arr[0]
array([[ 0.,
DataFrame与Series 之间的运算和上面差不多默认情况下,DataFrame 和 Series 之间的算术运算会将Series的索引匹配到DataFrame的列,然后沿着行向下广播
In [78]: frame = pd.DataFrame(np.arange(12.).reshape((4,3)),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])
In [79]: series = frame.ix[0]
In [80]: frame
[4 rows x 3 columns]
In [81]: series
Name: Utah, dtype: float64
In [82]: frame - series
[4 rows x 3 columns]
如果某个索引值在DataFrame的列或Series的索引中找不到,则参与运算的两个对象就会被重新索引以形成并集
In [89]: series2 = pd.Series(range(3),index=['b','e','f'])
In [90]: frame + series2
[4 rows x 4 columns]
如果你希望匹配行且在列上广播,则必须使用算术运算方法
In [98]: series3 = frame['d']
In [99]: frame
[4 rows x 3 columns]
In [100]: series3
Name: d, dtype: float64
In [101]: frame.sub(series3,axis=0)
[4 rows x 3 columns]
(5)函数应用和映射
NumPy 的ufuncs(元素级数组方法)也可用于操作pandas对象abs() 函数返回数字的绝对值
In [102]: frame = pd.DataFrame(np.random.randn(4,3),columns=list('bde'),
.....: index=['Utah','Ohio','Texas','Oregon'])
In [103]: frame
0...231538
-1...224967
-1...580048
Oregon -1...606694
[4 rows x 3 columns]
In [104]: np.abs(frame)
0...231538
1...224967
1...580048
1...606694
[4 rows x 3 columns]
DataFrame的apply 方法 将函数应用到由各列或行所形成的一维数组上
lambda只是一个表达式,函数体比def简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
lambda表达式是起到一个函数速写的作用。允许在代码内嵌入一个函数的定义。
In [106]: f = lambda x:x.max() - x.min()
In [107]: frame.apply(f)
dtype: float64
In [108]: frame.apply(f,axis=1)
dtype: float64
除了标量外,传递给apply的函数还可以返回由多个值组成的Series
In [120]: def f(x):
return pd.Series([x.min(),x.max()],index=['min','max'])
In [121]: frame.apply(f)
min -1...606694
0...580048
[2 rows x 3 columns]
元素级的Python函数也是可以用的format 是 得到浮点值的格式化字符串使用applymap函数
In [123]: format = lambda x:'%.2f' % x
In [124]: frame.applymap(format)
[4 rows x 3 columns]
Series有个应用与元素级别的函数的map方法
In [125]: frame['e'].map(format)
Name: e, dtype: object
要对行或列索引进行排序(按字典顺序),可以使用sort_index方法,它将返回一个已排序的新对象
In [127]: obj = pd.Series(range(4),index = ['b','a','d','c'])
In [128]: obj.sort_index()
dtype: int64
对于DataFrame则可以根据任意一个轴上的索引进行排序
In [132]: frame
[2 rows x 4 columns]
In [133]: frame.sort_index()
[2 rows x 4 columns]
In [134]: frame.sort_index(axis=1)
[2 rows x 4 columns]
数据默认是按照升序排序的,但也可以降序排序
In [135]: frame.sort_index(axis=1,ascending=False)
[2 rows x 4 columns]
如果按值对Series进行排序,可使用其order方法
In [137]: obj = pd.Series([4,7,-3,2])
In [138]: obj.order()
dtype: int64
在排序时,任何缺失值默认都会被放在Series的末尾
In [139]: obj = pd.Series([4,np.nan,7,np.nan,-3,2])
In [140]: obj.order()
dtype: float64
在DataFrame 上,你可能希望根据一个或多个列中的值进行排序我们只要将一个或多个列中的名字传递给by选项即可
In [141]: frame = pd.DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]})
In [142]: frame
[4 rows x 2 columns]
In [143]: frame.sort_index(by='b')
[4 rows x 2 columns]
In [144]: frame.sort_index(by=['a','b'])
[4 rows x 2 columns]
排名:与排序关系密切,它会增设一个排名值(从1开始,一直到数组中有效的数据);有时候它会根据某种规则破坏平级关系默认情况下rank是通过‘为各组分配一个平均排名’的方式破坏平级关系
In [153]: obj = pd.Series([7,-5,7,4,2,0,4])
In [154]: obj.rank()
dtype: float64
要根据原数据中顺序给出排名也可以按降序进行排名DataFrame 可以在行或列上计算排名(只需要声明axis即可),这里不再示范了
In [155]: obj.rank(method='first')
dtype: float64
In [156]: obj.rank(ascending=False,method='max')
dtype: float64
排名时用于破坏平级关系的method选项
(6)带有重复值的轴索引
许多pandas函数(如reindex)都要求标签唯一,但这并不是强制性索引的is_unique属性可以告诉你它的值是否是唯一
In [157]: obj = pd.Series(range(5),index = ['a','a','b','b','c'])
In [158]: obj
dtype: int64
In [159]: obj.index.is_unique
Out[159]: False
对于带有重复值的索引,数据选取的行为将会有些不同某个索引对应多个值,将会返回一个Series而对应单个值,则返回一个标量值
In [161]: obj['a']
dtype: int64
In [162]: obj['b']
dtype: int64
对DataFrame 进行索引的时候也是这样对于重复索引将返回一个DataFrame
In [163]: df = pd.DataFrame(np.random.randn(4,3),index=['a','a','b','b'])
In [164]: df
0...781164
a -1...074344
0...280768
1...083235
[4 rows x 3 columns]
In [165]: df.ix['b']
0...280768
1...083235
[2 rows x 3 columns]
汇总和计算描述统计:
pandas对象拥有一组常用的数学和统计方法,他们大部分都属于约简和汇总统计他们都是基于没有缺失数据的假设而构建的na值会被自动排除,除非整个切片(整个行或者列)都是na ,通过skipna 选项可以禁用该功能
In [54]: df = pd.DataFrame([[1.4,np.nan],[7.1,-4.5],
[np.nan,np.nan],[0.75,-1.3]],index = ['a','b','c','d'],
....: columns=['one','two'])
In [55]: df
[4 rows x 2 columns]
In [56]: df.sum()
dtype: float64
In [57]: df.sum(1)
dtype: float64
In [58]: df.mean(axis=1,skipna=False)
dtype: float64
约简方法的选项
有些方法返回的是间接统计idxmin/idxmax有些方法则是累计型的
In [64]: df.idxmax()
dtype: object
In [65]: df.cumsum()
[4 rows x 2 columns]
describe 即不是约简型也不是累计型它用于一次性产生多个汇总统计
In [67]: df.describe()
对于非数组型数据,describe会产生另外一种汇总统计
In [69]: obj = pd.Series(['a','a','b','c']*4)
In [70]: obj
dtype: object
In [71]: obj.describe()
dtype: object
描述和汇总统计
(1)相关系数与协方差
读取来自Yahoo!Finance的股票价格和成交量
#!/usr/bin/env python
# coding=utf-8
import pandas as pd
import pandas.io.data as web
all_data = {}
for ticker in ['AAPL','IBM','MSFT','GOOG']:
all_data[ticker] = web.get_data_yahoo(ticker,'1/1/2000','1/1/2010')
price = pd.DataFrame({tic:data['Adj Close']
for tic,data in all_data.iteritems()})
volume = pd.DataFrame({tic:data['Volume']
for tic, data in all_data.iteritems()})
Series的corr方法用于计算两个Series中重叠的,非NA的,按索引对齐的值的相关系数cov用于计算协方差
In [33]: returns = price.pct_change()
In [34]: returns.tail()
0....002587
0....005484
-0....007058
0....013699
-0....015504
[5 rows x 4 columns]
In [35]: returns.MSFT.corr(returns.IBM)
Out[35]: 0.35241
In [36]: returns.MSFT.cov(returns.IBM)
Out[36]: 0.
DataFrame的corr 和 cov 方法将以DataFrame的形式返回完整的相关系数或协方差矩阵
In [38]: returns.corr()
1....424305
0....443587
0....495980
0....000000
[4 rows x 4 columns]
In [39]: returns.cov()
0....000309
0....000205
0....000216
0....000516
[4 rows x 4 columns]
利用DataFrame的corrwidth方法,你可以计算其列或行跟另一个Series或DataFrame之间的相关系数传入一个Series将会返回一个相关系数值Series(针对各列进行计算)
In [40]: returns.corrwith(returns.IBM)
dtype: float64
传入一个DataFrame则会计算按列名配对的相关系数,这里,我们计算百分比变换与成交量的相关系数
In [43]: returns.corrwith(volume)
dtype: float64
传入axis=1 即按行进行计算,无论何时,在计算相关系数之前,所有数据项都会按照标签进行对齐
(2)唯一值、值计数以及成员资格
这类方法,我们可以从一维Series的值中提取信息第一个函数可以得到Series中的唯一值数组
In [44]: obj = pd.Series(['c','a','d','a','a','b','b','c','c'])
In [47]: uniques = obj.unique()
In [48]: uniques
Out[48]: array(['c', 'a', 'd', 'b'], dtype=object)
返回的唯一值是未经排序的,如果需要的话,可以对结果再次进行排序value_counts用于计算一个Series中各值出现的频率
In [50]: uniques.sort()
In [51]: uniques
Out[51]: array(['a', 'b', 'c', 'd'], dtype=object)
In [52]: obj.value_counts()
dtype: int64
value_counts是Series是按值频率降序排列的value_counts还是一个顶级pandas方法,可用于任何数组或序列
In [53]: pd.value_counts(obj.values,sort=False)
dtype: int64
isin函数用于判断矢量化集合的成员资格就是看obj中的每个元素是否在我们传入函数中的那个集合中
In [55]: mask = obj.isin(['a','c'])
In [56]: mask
dtype: bool
In [57]: obj[mask]
dtype: object
唯一值、值计数、成员资格方法
将pandas.value_counts传给该DataFrame的apply函数行索引就是该DataFrame中的所有唯一数据,该Dataframe的值就是出现的频率
In [58]: data = pd.DataFrame({'Qu1':[1,3,4,3,4],
....: 'Qu2':[2,3,1,2,3],
....: 'Qu3':[1,5,2,4,4]})
In [59]: data
[5 rows x 3 columns]
In [60]: result = data.apply(pd.value_counts).fillna(0)
In [61]: result
[5 rows x 3 columns]
处理缺失数据:
pandas使用浮点值NaN表示浮点和非浮点数组中的缺失数据,他只是一个便于被检测出来的标记而已python 内置的None 值也会被当做NA 处理
In [66]: string_data = pd.Series(['aardvark','artichoke',np.nan,'avocado'])
In [67]: string_data
dtype: object
In [69]: string_data.isnull()
dtype: bool
In [70]: string_data[0] = None
In [71]: string_data.isnull()
dtype: bool
NA处理方法
(1)滤除缺失数据
drZ喎"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcG5ht7W72NK7uPa99rqst8e/1cr9vt26zcv30v0mIzIwNTQwO7XEU2VyaWVzzai5/bK8tvvQzcv30v3Ssr/J0tS077W91eK49sS/tcQKPGRpdj48cHJlIGNsYXNzPQ=="brush:">In [72]: from numpy import nan as NA
In [73]: data = pd.Series([1,NA,3.5,NA,7])
In [74]: data.dropna()
dtype: float64
In [75]: data[data.notnull()]
dtype: float64
对于DataFrame 对象,事情就有点复杂了dropna默认丢弃任何含有缺失值的行传入how=‘all' 将只丢弃全为NA的那些行传入axis = 1 将删除全为NA的那些列
In [76]: data = pd.DataFrame([[1.,6.5,3.],[1.,NA,NA],
....: [NA,NA,NA],[NA,6.5,3.]])
In [77]: cleaned = data.dropna()
In [78]: data
[4 rows x 3 columns]
In [79]: cleaned
[1 rows x 3 columns]
In [80]: data.dropna(how='all')
[3 rows x 3 columns]
In [81]: data.dropna(axis=1,how='all')
[4 rows x 3 columns]
当你只想留下某些数据时,可以利用thresh 参数来设定
In [90]: df.ix[:4,1] = NA;df.ix[:3,2] = NA
In [91]: df
3 -0.059859
4 -1.917175
NaN -1.122671
5 -0...266332
0...241783
[7 rows x 3 columns]
In [92]: df.dropna(thresh=4)
Empty DataFrame
Columns: [0, 1, 2]
[0 rows x 3 columns]
In [93]: df.dropna(thresh=3)
5 -0...266332
0...241783
[2 rows x 3 columns]
(2)填充缺失数据
fillna方法
In [97]: df.fillna(0)
0...000000
0...000000
0...000000
3 -0...000000
4 -1...122671
5 -0...266332
0...241783
[7 rows x 3 columns]
In [99]: df.fillna({1:0.5,2:-1})
0...000000
0...000000
0...000000
3 -0...000000
4 -1...122671
5 -0...266332
0...241783
[7 rows x 3 columns]
fillna 默认会返回新对象,但也可以对现有对象进行就地修改
In [100]: _ = df.fillna(0,inplace=True)
In [101]: df
0...000000
0...000000
0...000000
3 -0...000000
4 -1...122671
5 -0...266332
0...241783
[7 rows x 3 columns]
fillna函数的参数
层次化索引:
使用低维度形式处理高维度数据创建一个Series,并用一个由列表或数组组成的列表作为索引这就是带有MultiIndex索引的Series的格式化输出形式索引之间的间隔表示直接使用上面的标签对于一个层次化索引的对象,选取数据子集的操作很简单
In [105]: data = pd.Series(np.random.randn(10),
.....: index = [['a','a','a','b','b','b','c','c','d','d'],
.....: [1,2,3,1,2,3,1,2,2,3]])
In [106]: data
dtype: float64
In [107]: data.index
MultiIndex(levels=[[u'a', u'b', u'c', u'd'], [1, 2, 3]],
labels=[[0, 0, 0, 1, 1, 1, 2, 2, 3, 3], [0, 1, 2, 0, 1, 2, 0, 1, 1, 2]])
In [108]: data['b']
dtype: float64
可以在“内层”中进行选取
In [109]: data[:,2]
dtype: float64
层次化索引在数据重塑和基于分组的操作中扮演着重要的角色可以利用unstack 方法被重新安排到一个DataFrame中
In [110]: data.unstack()
a -0...685961
0...962065
c -1..393728
[4 rows x 3 columns]
In [111]: data.unstack().stack()
dtype: float64
对于一个DataFrame,每条轴都可以有分层索引每层都可以有名字;如果制定了名称,他们就会显示在控制台输出中不要将索引名跟轴标签混为一谈
In [113]: frame = pd.DataFrame(np.arange(12).reshape((4,3)),
index = [['a','a','b','b'],[1,2,1,2]],
columns = [['Ohio',"Ohio",'Colorado'],
['Green','Red','Green']])
In [114]: frame
[4 rows x 3 columns]
In [115]: frame.index.names = ['key1','key2']
In [116]: frame.columns.names = ['state','color']
In [117]: frame
[4 rows x 3 columns]
可以单独创建MultiIndex 然后复用,上面那个DataFrame中的(分级)列可以这样创建
In [125]: col = pd.MultiIndex.from_arrays([['Ohio','Ohio','Colorado'],['Green','Red','Green']],names=['state','color'])
In [126]: frame2 = pd.DataFrame(np.arange(12).reshape((4,3)),
index = [['a','a','b','b'],[1,2,1,2]],
columns = col )
In [127]: frame2
[4 rows x 3 columns]
(1)重排分级顺序
swaplevel 接受两个级别编号或名称,并返回一个互换了级别的新对象
In [129]: frame.swaplevel('key1','key2')
[4 rows x 3 columns]
sortlevel 则根据单个级别中的值对数据进行排序交换级别时,常常也会用到sortlevel
In [130]: frame.sortlevel(1)
[4 rows x 3 columns]
In [131]: frame
[4 rows x 3 columns]
In [132]: frame.sortlevel(0)
[4 rows x 3 columns]
In [134]: frame.swaplevel(0,1)
[4 rows x 3 columns]
In [135]: frame
[4 rows x 3 columns]
In [136]: frame.swaplevel(0,1).sortlevel(0)
[4 rows x 3 columns]
(2)根据级别汇总统计
我们可以根据行或列上的级别来进行求和
In [137]: frame.sum(level='key2')
[2 rows x 3 columns]
In [138]: frame.sum(level='color',axis=1)
[4 rows x 2 columns]
(3)使用DataFrame的列
DataFrame 的 set_index 函数会将其一个或多个列转换为行索引,并创建一个新的DataFrame
In [139]: frame = pd.DataFrame({'a':range(7),'b':range(7,0,-1),
.....: 'c':['one','one','one','two','two','two','two'],
.....: 'd':[0,1,2,0,1,2,3]})
In [140]: frame
[7 rows x 4 columns]
In [141]: frame2 = frame.set_index(['c','d'])
In [142]: frame2
[7 rows x 2 columns]
默认情况下,那些列会从DataFrame中移除,但也可以将其保留下来reset_index 的功能跟set_index刚好相反,层次化索引的级别会被转移到列里面
In [143]: frame.set_index(['c','d'],drop=False)
[7 rows x 4 columns]
In [144]: frame2.reset_index()
[7 rows x 4 columns]
红黑联盟&版权所有
Copyright&& 2017
All rights reserved.}