您的位置:首页 > 理论基础 > 数据结构算法

数据结构之--series,DataFrame.use python and pandas for data mining

2016-03-27 13:08 1226 查看

1.好的数据结构是数据分析的基础,一个高效的数据分析方法离不开数据的构造,series and DataFrame是两种高效简单的数据类型。

2.Series是一个一维的类似的数组对象,包含一个数组的数据(任何NumPy的数据类型)和一个与数组关联的数据标签,被成为索引(index),索引显示在左边,值显示在右边,其中索引在不指定的情况下从0到N-1之间自动产生,N是指数据的长度。

l1 = Series([1,3,4,2])
print l1
print type(l1)


OUT

0    1
1    3
2    4
3    2
dtype: int64
<class 'pandas.core.series.Series'>


IN

l1 = Series([1,3,4,2])
print l1.values
print l1.index


OUT

[1 3 4 2]
Int64Index([0, 1, 2, 3], dtype='int64')


自定义索引

IN

l1 = Series([1,3,4,2],index=['d','g','k','b'])
print l1.values
print l1.index


OUT

[1 3 4 2]
Index([u'd', u'g', u'k', u'b'], dtype='object')


一个值或是多个值的选择

IN:

l1 = Series([1,3,4,2],index=['d','g','k','b'])
# print l1.values
# print l1.index
print l1['d']
print l1[['g','k','b']]


OUT

1
g    3
k    4
b    2
dtype: int64


2.1 说了上面那么多,那么相比于numpy,这种数据究竟有什么不一样的优势呢?——它能在数据计算后保持数据的关联性。

IN

l1 = Series([1,3,4,2],index=['d','g','k','b'])
print l1[l1>2]
print "*****************"
print l1*2
print "*****************"
print np.exp(l1)


OUT

g    3
k    4
dtype: int64
*****************
d    2
g    6
k    8
b    4
dtype: int64
*****************
d     2.718282
g    20.085537
k    54.598150
b     7.389056
dtype: float64


从上面看起来,Series是种有序定长的字典

那么python中的字典能不能直接转化为Series呢?of course!

l2 = {'w':1,'ww':2,'wwww':4,'www':3,'wwwwww':6}
print l2
l3 = Series(l2)
print l3


out

{'ww': 2, 'wwww': 4, 'www': 3, 'wwwwww': 6, 'w': 1}
w         1
ww        2
www       3
wwww      4
wwwwww    6
dtype: int64


in

l2 = {'w':1,'ww':2,'wwww':4,'www':3,'wwwwww':6}
new_index=['w','ww','wwwww','wwww','wwww']
l3 = Series(l2,index = new_index)
print l3


out

w         1
ww        2
wwwww   NaN
wwww      4
wwww      4
dtype: float64


在这种数据结构中缺失的数据用的NAN表示,在pandas中用函数 isnull 和 notnull 来检测数据丢失。

l2 = {'w':1,'ww':2,'wwww':4,'www':3,'wwwwww':6}
new_index=['w','ww','wwwww','wwww','wwww']
l3 = Series(l2,index = new_index)
print l3
print "--------------------"
print pd.isnull(l3)
print pd.notnull(l3)


OUT

w         1
ww        2
wwwww   NaN
wwww      4
wwww      4
dtype: float64
--------------------
w False
ww False
wwwww True
wwww False
wwww False
dtype: bool
w True
ww True
wwwww False
wwww True
wwww True
dtype: bool


这种数据结构可以自动对齐

l1 = Series([1,3,4,2],index=['w','g','k','b'])
l2 = {'w':1,'ww':2,'wwww':4,'www':3,'wwwwww':6}
new_index=['w','ww','wwwww','wwww','wwww']
l3 = Series(l2,index = new_index)
print l1,l3
print l1+l3


out

w    1
g    3
k    4
b    2
dtype: int64 w         1
ww        2
wwwww   NaN
wwww      4
wwww      4
dtype: float64
b NaN
g NaN
k NaN
w 2
ww NaN
wwww NaN
wwww NaN
wwwww NaN
dtype: float64


series中值和索引的name属性

l1 = Series([1,3,4,2],index=['w','g','k','b'])
# l2 = {'w':1,'ww':2,'wwww':4,'www':3,'wwwwww':6}
# new_index=['w','ww','wwwww','wwww','wwww']
# l3 = Series(l2,index = new_index)
l1.name = 'nameOne'
l1.index.name = '1'
print l1


OUT

1
w    1
g    3
k    4
b    2
Name: nameOne, dtype: int64


到此关于series的基本用法阐述完毕,如有什么不清楚的可以在下面给我留言,欢迎大家交流。

3. DataFrame数据结构

DataFrame可以看成是一个表格,这个表格是一个经过排序的列表集,这个列表集有中可以有不同的数据类型,行和列的操作基本相等的,关于这种数据结构的理解,请看下面相关的示例

DataFrame的构建

l1 ={"one" :['a','aa','aaaa','aaa','aaaaaa'],
"two" :['b','bb','bbbb','bbb','bbbbbb'],
"three" :['w','ww','wwww','www','wwwwww']}
print l1
print "---------------------------"
l2 = DataFrame(l1)
print l2


out

{'three': ['w', 'ww', 'wwww', 'www', 'wwwwww'], 'two': ['b', 'bb', 'bbbb', 'bbb', 'bbbbbb'], 'one': ['a', 'aa', 'aaaa', 'aaa', 'aaaaaa']}
---------------------------
one   three     two
0       a       w       b
1      aa      ww      bb
2    aaaa    wwww    bbbb
3     aaa     www     bbb
4  aaaaaa  wwwwww  bbbbbb


上面对列分配了索引,并且排序

如何按自己的顺序来排列数据

l1 ={"one" :['a','aa','aaaa','aaa','aaaaaa'],
"two" :['b','bb','bbbb','bbb','bbbbbb'],
"three" :['w','ww','wwww','www','wwwwww']}

l2 = DataFrame(l1)
print l2
print "---------------------------"
l3 = DataFrame(l1, columns=['three', 'one', 'two'])
print l3


out

one   three     two
0       a       w       b
1      aa      ww      bb
2    aaaa    wwww    bbbb
3     aaa     www     bbb
4  aaaaaa  wwwwww  bbbbbb
---------------------------
three     one     two
0       w       a       b
1      ww      aa      bb
2    wwww    aaaa    bbbb
3     www     aaa     bbb
4  wwwwww  aaaaaa  bbbbbb


检索行、列

l1 ={"one" :['a','aa','aaaa','aaa','aaaaaa'],
"two" :['b','bb','bbbb','bbb','bbbbbb'],
"three" :['w','ww','wwww','www','wwwwww']}
l2 = DataFrame(l1)
print l2.ix[2]
print "---------------------------"
print l2["two"]


out

one      aaaa
three    wwww
two      bbbb
Name: 2, dtype: object
---------------------------
0         b
1        bb
2      bbbb
3       bbb
4    bbbbbb
Name: two, dtype: object


行列数据都能通过赋值改变,可以通过series精确赋值。给不存在的列赋值会创建新的值。任何在series上的修改都会影响DataFrame.

如果一个DataFrame的 index 和 columns 有它们的 name ,也会被显示出来,

l1 ={"one" :['a','aa','aaaa','aaa','aaaaaa'],
"two" :['b','bb','bbbb','bbb','bbbbbb'],
"three" :['w','ww','wwww','www','wwwwww']}
l2 = DataFrame(l1)
l2.index.name = 'year'
l2.columns.name = 'state'
print l2


OUT

state     one   three     two
year
0           a       w       b
1          aa      ww      bb
2        aaaa    wwww    bbbb
3         aaa     www     bbb
4      aaaaaa  wwwwww  bbbbbb


in

l1 ={"one" :['a','aa','aaaa','aaa','aaaaaa'],
"two" :['b','bb','bbbb','bbb','bbbbbb'],
"three" :['w','ww','wwww','www','wwwwww']}
l2 = DataFrame(l1)
l2.index.name = 'year'
l2.columns.name = 'state'

print l2.values


out

[['a' 'w' 'b']
['aa' 'ww' 'bb']
['aaaa' 'wwww' 'bbbb']
['aaa' 'www' 'bbb']
['aaaaaa' 'wwwwww' 'bbbbbb']]


索引方法和属性

append 链接额外的索引对象,产生一个新的索引

diff 计算索引的差集

intersection 计算交集

union 计算并集

isin 计算出一个布尔数组表示每一个值是否包含在所传递的集合里

delete 计算删除位置i的元素的索引

drop 计算删除所传递的值后的索引

insert 计算在位置i插入元素后的索引

is_monotonic 返回True,如果每一个元素都比它前面的元素大或相等

is_unique 返回True,如果索引没有重复的值

unique 计算索引的唯一值数组

4. series和DataFrame关键特性的使用

在Series上调用 reindex 重排数据,使得它符合新的索引,如果那个索引的值不存在就引入缺失数据值

ll1 = Series([4.5, 7.2, -5.3, 3.6], index=['d', 'b', 'a', 'c'])
ll2 = ll1.reindex(['a', 'b', 'c', 'd', 'e'])
print ll2


out

a   -5.3
b    7.2
c    3.6
d    4.5
e    NaN
dtype: float64


reindex 的 method(内插)选项,自己去研究,删除条目用.drop()

过滤

obj.ix[val] 从DataFrame的行集选择单行

obj.ix[:, val] 从列集选择单列

obj.ix[val1, val2] 选择行和列

reindex 方法 转换一个或多个轴到新的索引

xs 方法 通过标签选择单行或单列到一个Series

icol, irow 方法 通过整数位置,分别的选择单行或单列到一个Series

get_value, set_value 方法 通过行和列标选择一个单值

reference:

http://pda.readthedocs.org/en/latest/chp5.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: