import pandas as pd
import numpy as np
from pandas import Series,DataFrame
1 Pandas的数据结构
(1)Series - - 类似一维数组对象
- - 创建Series:
- - ①obj = pd.Series([],index=[])
可直接传入一个列表,则索引自动创建,范围为 [0,N-1] ,N为列表长度;或者传入一个列表和一个index=[]
;
- - ②obj = pd.Series({})
传入一个字典,(index)索引则为字典的(key)键;
- - ③obj = pd.Series({},index=[])
传入一个字典和一个index=[]
,index即已排好序的字典的键,如果有index索引与字典的键无匹配,则相应索引的键值为:NaN (Not a Number).,可用pd.isnull(obj)或obj.isnull()
或pd.notnull(obj)或obj.notnull()
检测缺失数据。
- - 通过索引查询操作Series:
- - ①可通过Series的values和index属性获取数组形式的values和索引obj.values
obj.index
- - ②可通过查询索引类似字典的方式查询,不同的是可传入一个索引列表,以此查询多个索引。obj[1]
obj[[1,2,3]]
- - ③可使用numpy的运算(布尔型数组过滤,乘法,数学函数等)obj[obj>0]
obj[obj*2]
np.exe(obj)
结果的索引都不变
- - ④通过index in obj
检测相应索引是否在obj中
- - ⑤可通过赋值给obj的index一个列表用来修改想修改的索引名obj.index=['相应个数的索引名']
- -关键的name属性
- - ①Series对象本身和索引都有一个name属性,对象name:obj.name=''
:指这个对象的名称,类似数据库的表名;索引nameobj.index.name=''
:指对象的所以名称,类似数据库表中属性。
(2)DataFrame - - 表格数据结构,其中数据以二维数组形式存放
- - 创建DataFrame
- - ①传入一个由等长列表或NumPy数组组成的字典,如果未指定索引会自动加上 [0,N-1] 的索引,frame = pd.DataFrame(data={})
;也可以加上索引frame = pd.DataFrame(data={},index=[])
data = {'country':['China','USA','Englang','Jan','Italy','France'],
'year':[2018,2016,2017,2016,2015,2018],
'pop':[14,9,10,2,6,8]
}
frame = pd.DataFrame(data)
frame
country pop year
0 China 14 2018
1 USA 9 2016
2 Englang 10 2017
3 Jan 2 2016
4 Italy 6 2015
5 France 8 2018
frame=pd.DataFrame(data,index=['one','two','three','four','five','six'])
frame
country pop year
one China 14 2018
two USA 9 2016
three Englang 10 2017
four Jan 2 2016
five Italy 6 2015
six France 8 2018
-
- ②以嵌套字典的形式创建DataFrame,
data={'column1':{row1:value1,row2:value2......},'column2':{row1:value,row2:value2....},.....}
pandas会被解释为:外层字典的键作为列,内层键作为行索引.。某一列不存在其他列的某一行索引,值为 NaN.。另外内层字典的键(行索引)会被合并、排序形成最终的索引,若明确指定了索引,则会按顺序有选择的输出相应的行pd.DataFrame(data,index=[])
- ②以嵌套字典的形式创建DataFrame,
data2 = {'China':{2010:13,2018:14},'USA':{2010:10,2017:9,2018:10}}
frame2 = pd.DataFrame(data2)
frame2
China USA
2010 13.0 10
2017 NaN 9
2018 14.0 10
-
- ③Series组成的字典创建DataFrame,行索引默认为原Series的索引(也可自己定义),列索需自定义。
pdata = {'coun_try':frame['country'],'ye_ar':frame['year']}
frame3 = pd.DataFrame(pdata)
frame3
coun_try ye_ar
one China 2018
two USA 2016
three Englang 2017
four Jan 2016
five Italy 2015
six France 2018
-
- 修改,查询,操作DataFrame
-
- ①若指定了列序列,则DataFrame的列就会按 columns=[] 中指定的顺序进行排列
pd.DataFrame(data,columns=[column3,column2,column1])
;若在columns中传入了一个DataFrame中不存在的列,则会自动创建那个列,列中的值均为NaN。以上均为重新创建了一个DataFrame,行index默认均为 [0,N-1],根据需要重新指定行索引pd.DataFrame(data,columns=[column3,column2,column1],index=[])
- ①若指定了列序列,则DataFrame的列就会按 columns=[] 中指定的顺序进行排列
pd.DataFrame(data,columns=['year','pop','year','city'])
year pop year city
0 2018 14 2018 NaN
1 2016 9 2016 NaN
2 2017 10 2017 NaN
3 2016 2 2016 NaN
4 2015 6 2015 NaN
5 2018 8 2018 NaN
pd.DataFrame(data,columns=['year','pop','year','city'],index=['one','two','three','four','five','six'])
year pop year city
one 2018 14 2018 NaN
two 2016 9 2016 NaN
three 2017 10 2017 NaN
four 2016 2 2016 NaN
five 2015 6 2015 NaN
six 2018 8 2018 NaN
-
- ②可以通过字典方式或 “.”(点)属性方式获取一列即为一个Series:
frame.column_name
或frame['column_name']
;可以用frame['column_name']=values
方法创建一个原本不存在的列.
- ②可以通过字典方式或 “.”(点)属性方式获取一列即为一个Series:
-
- ③列可以通过赋值方式给一列赋上同一个标量值或不同的一组值
frame['column_name'] 或 frame.column_name=valuse
; 或赋给列一个与DataFrame 长度相等的列表或数组frame['column_name'] 或 frame.column_name=list 或 array(numpy定义)
。
- ③列可以通过赋值方式给一列赋上同一个标量值或不同的一组值
-
- ④可以赋值一个Series,设置与需要修改数据的DataFrame相应列的行索引,会精确匹配进行修改,
test = pd.Series([修改后的值], index=[需要修改的行索引])
frame['column_name'] = test
frame2 = pd.DataFrame(data,columns=['year','country','pop','city'],
index=['one','two','three','four','five','six'])
test = pd.Series(['BeiJing','Tokyo','London'],index=['one','four','three'])
frame2['city']=test
frame2
year country pop city
one 2018 China 14 BeiJing
two 2016 USA 9 NaN
three 2017 Englang 10 London
four 2016 Jan 2 Tokyo
five 2015 Italy 6 NaN
six 2018 France 8 NaN
-
- ⑤ del 用来删除列
del frame['column']
- ⑤ del 用来删除列
-
- ⑥ DataFrame同样可以定义行索引,和(columns)列索引的name
frame.index.name='value'
;frame.columns.name='value'
- ⑥ DataFrame同样可以定义行索引,和(columns)列索引的name
-
- ⑦同Series,DataFrame的values属性也会以二维数组形式返回其中数据。