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: