在实习的项目中,得到宽表后的后续工作是用R语言写的,包括数据探索,数据清洗,建模,模型分析。因为之前用过python,写过简单爬虫,就想着自己试着将R语言的脚本写成python,或许对于未来有帮组、
然而,在pyhon3.5连接teradata的问题上一直搞不通、、、
所以,只能先学一下pandas之类的基础了,本来想法是直接将R语言改成python,简单粗暴的方法也是最有效的做法。
一、pandas包的常用数据类型:Series和DataFrame
其实,Series和DataFrame分别对应的是R语言中的向量和数据框data.frame,连名字都一样。我个人觉得没多大的差别,只是听说python的DataFrame比R的dataframe更强大,慢慢研究吧。
我觉得,Series和DataFrame比起R语言中的向量和数据框,只是丰富了行的功能,也就是索引值。在R语言中,数据框就更类似于数据库中的表,更关注的是列,也就是属性。数据库中筛选列用select,筛选行用where。
1、Series:向量
python的常用数据类型,list,tuple,dictionary,pandas包中的Series可以接收这三者的值,并将其转换成向量,list和tuple是没有索引的(index),dictionary是默认将key当做索引,而values当做值。
①接收一个tuple:
>ser1=Series(('a','b','c'))
>ser1
Out[173]:
0 a
1 b
2 c
dtype: object
②接收一个list:
>ser2=Series(['m','n','q'])
>ser2
Out[175]:
0 m
1 n
2 q
dtype: object
③接收一个dictionary:
>ser3=Series({'a':[1,2,3],'b':[1,5,6]})
>ser3
Out[177]:
a [1, 2, 3]
b [1, 5, 6]
dtype: object
>ser3.index
Out[178]: Index(['a', 'b'], dtype='object')
>ser3.values
Out[179]: array([[1, 2, 3], [1, 5, 6]], dtype=object)
>ser3.values[1]
Out[180]: [1, 5, 6]
④可以指定索引值,如果没有指定Series的索引,则自动生成从0开始的索引值。
>ser4=Series([2,3,4,5,6],index=['a','b','c','d','e'])
>ser4
Out[184]:
a 2
b 3
c 4
d 5
e 6
dtype: int64
如果索引值不足,则提示错误,超出也会提示错误。只能一对一、、、
很明显可以通过索引值来得到values的值,这与R语言向量一样。
>ser4['c']
Out[190]: 4
⑤两个Series的合并运算,类似SQL的连接,R语言中的marge()。
>ser
Out[192]:
ohio 3500
oregon 1600
texas 7100
utah 500
dtype: int64
>ser2
Out[194]:
ohio 3500
oregon 1600
texas 7100
california 400
>ser+ser2
Out[195]:
california NaN
ohio 7000.0
oregon 3200.0
texas 14200.0
utah NaN
Series就这些东西,太简单了,去R语言了解一下向量的用法,基本上就可以懂的差不多。
不同的是,Series是python的包,故操作python中的数据类型,有意思!
2、DataFrame 数据框,
Series是一个带索引的一列,但是DataFrame是一个带索引的多列,多了很多方法。
①DataFrame同样可以接受python自带的数据类型list,dictionary,但是接收不了tuple,最多只能接收两个list。
>pd=DataFrame({'a':[1,2,3],'b':[3,5,6],'c':[2,6,8]})
>pd
Out[206]:
a b c
0 1 3 2
1 2 5 6
2 3 6 8
或者:
>dic={'a':[1,2,3],'b':[3,5,6],'c':[2,6,8]}
>pd2=DataFrame(dic,index=['one','two','three'])
>pd2
Out[216]:
a b c
one 1 3 2
two 2 5 6
three 3 6 8
很有意思的是,DataFrame可以接收一个嵌套的dictionary字典,外层keys默认是列名,内层keys默认是行名,也就是索引index,列子如下:
>pd3=DataFrame({'a':{2001:2.4,2002:2.5},'b':{2000:2.3,2001:2.7,2002:3.5},'c':{2001:4.8,2002:3.9}})
>pd3
Out[225]:
a b c
2000 NaN 2.3 NaN
2001 2.4 2.7 4.8
2002 2.5 3.5 3.9
DataFrame是一个列的数据集合,其引用列的方式为:
>pd2['a']
Out[219]:
one 1
two 2
three 3
Name: a, dtype: int64
或者:
>pd2.a
Out[220]:
one 1
two 2
three 3
Name: a, dtype: int64
没了,也不知道哪里需要研究的,拿来就可以用,DataFrame的底层实现也不用去研究,python在数据处理中只当做一个工具,至于DataFrame.ix属性的使用, 下面再补充吧。
3、索引index
①reindex:重新排列索引,如果根据重新排列的索引找不到原来值则默认是NaN值;
>pd2
Out[237]:
a b c
one 1 3 2
two 2 5 6
three 3 6 8
>pd2.reindex(index=['three','two','one'])
Out[239]:
a b c
three 3 6 8
two 2 5 6
one 1 3 2
对列进行重新索引为:
>pd2.reindex(columns=['b','c','a'])
Out[240]:
b c a
one 3 2 1
two 5 6 2
three 6 8 3
4、drop()函数
与reindex()一样,默认也是对行进行操作,
df.drop([’one','two'],axis=0):删除df中索引名index是'one'和'two'的两行
df.drop(['a','b'],axis=1):删除df中列名是’a'和‘b’的两列
5、pandas专门引用了一个ix属性,用来按照类似numpy包方法引用数据
>pd2
Out[257]:
a b c
one 1 3 2
two 2 5 6
three 3 6 8
>pd2.ix['two',['a','b']]
Out[258]:
a 2
b 5
Name: two, dtype: int64
注释:pd2.ix是属性值,用引用list的方式引用它,中间用逗号隔开,前后分别是行列,这个跟R语言也一样。
R语言中,如果选择第1到第3号,和全部的列用df[1:3,],而在python中用df[1:3,:],冒号不能省略!
有了DataFrame.ix后,数据框的引用非常的方便。