Python数据挖掘第二个包——pandas包的常用用法
前面介绍了numpy包在矩阵、线性代数等方面的基础应用,pandas包与numpy包配合使用可以发挥巨大的威力,正是有了pandas包,python做数据挖掘才有了可能与优势。
Series
创建
利用Series类可以实现类似字典,却又比字典更强大的功能。它可以快速创建类似一维数据结构,将字典键值有序分离。
基本用法是:
s = pd.Series(data, index=index)
data,index分别相当于字典的值与键,长度必须一样。
1、利用numpy的ndarray对象创建
s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
s
a 2.013739
b -0.630078
c -0.703417
d 0.573144
e -0.880473
dtype: float64
取出键和值:
s.index
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
s.values
array([ 2.01373873, -0.6300784 , -0.70341655, 0.57314446, -0.88047338])
index值可以不提供,这时会自动生成一个从0开始的有序序列
pd.Series(np.random.randn(5))
0 2.190443
1 0.474874
2 -2.544448
3 -0.341525
4 -1.781728
dtype: float64
2、利用字典创建
d = {'a' : 0., 'b' : 1., 'c' : 2.}
pd.Series(d)
a 0.0
b 1.0
c 2.0
dtype: float64
它会自动识别分离键值。
元素选取、切片
1、索引、条件选取、切片
>>> s[0]
2.013738728629801
>>> s['a']
2.013738728629801
>>> s[:2]
a 2.013739
b -0.630078
dtype: float64
>>> s[[0,2,3]]
a 2.013739
c -0.703417
d 0.573144
dtype: float64
s[s>0]
a 2.013739
d 0.573144
dtype: float64
2、类似ndarray用法
>>>np.exp(s)
a 7.491273
b 0.532550
c 0.494892
d 1.773836
e 0.414587
dtype: float64
>>>s.mean()
0.074582972738879344
>>>s+s
a 4.027477
b -1.260157
c -1.406833
d 1.146289
e -1.760947
dtype: float64
通过前面介绍,我们知道ndarray()对象有一些统计等属性函数,这里Series对象也可以用,可见它们是相似的。
DataFrame
数据框是一种常用、功能强大的二维数据结构,有了它,可以很方便建立大量、方便查询定位的数据表。
d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
'two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
这就创建了一个有两个元素的字典,将其变为数据框后应该有两列,对应元素个数为行数,行标为键值,这个还是比较好理解的。
1、创建
df = pd.DataFrame(d)
df
one two
a 1.0 1.0
b 2.0 2.0
c 3.0 3.0
d NaN 4.0
不够的,填充缺失值NAN。
pd.DataFrame(d, index=['d', 'b', 'a'])
one two
d NaN 4.0
b 2.0 2.0
a 1.0 1.0
相当于把index指定的行拿出来生成数据框。
获取列名,行名实际是index属性
df.columns
Index(['one', 'two'], dtype='object')
data = np.arange(16).reshape(4,4)
>>> pd.DataFrame(data,index = ['a','b','c','d'])
0 1 2 3
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15
>>> pd.DataFrame(data,columns = ['col_1','col_2','col_3','col_4'])
col_1 col_2 col_3 col_4
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15
2、利用字典元素的列表创建
data2 = [{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
>>> data2
[{'a': 1, 'b': 2}, {'a': 5, 'b': 10, 'c': 20}]
>>> s3 = pd.DataFrame(data2)
a b c
0 1 2 NaN
1 5 10 20.0
列表元素个数就是行数,字典键的个数就是列数,比如这里,'a'为键的值有1和5,显然,就是属性(列),可以这样理解。
3、怎么取值呢
>>> s3['a']
0 1
1 5
Name: a, dtype: int64
>>> s3['a'][0]
1
>>> s3['a'][1]
5
>>> s3.index
RangeIndex(start=0, stop=2, step=1)
>>> s3.columns
Index(['a', 'b', 'c'], dtype='object')
4、还可以这样创建
pd.DataFrame.from_items([('a',[1,2,3]),('b',[4,5,6])])
a b
0 1 4
1 2 5
2 3 6
pd.DataFrame.from_items([('a',[1,2,3]),('b',[4,5,6])],orient = 'index',columns=['one','two','three'])
one two three
a 1 2 3
b 4 5 6
相当于转置了一下,不过要加参数orient = 'index',还必须指定列名columns=['one','two','three']。
5、分组计算
groupby()
s4 = pd.DataFrame.from_items([('a',[1,2,3,1,2,3]),('b',[4,5,6,4,5,6]),('c',[7,8,9,7,8,9])])
s4
a b c
0 1 4 7
1 2 5 8
2 3 6 9
3 1 4 7
4 2 5 8
5 3 6 9
现在想根据'a'的不同取值,计算均值
s4.groupby('a').mean()
b c
a
1 4 7
2 5 8
3 6 9
显然,'a'取值‘1’的时候,b'取值为4,4,均值为4,然后进行排序。
agg()函数
这个函数可以分别指定对不同列的操作。
s4.groupby('a').agg({'b':'sum','c':'mean'})
b c
a
1 8 7
2 10 8
3 12 9
欢迎留言、提建议、意见,觉得不错,记得【点赞、分享】!
猜你可能喜欢
终于等到你了!
再华丽的词藻也不过简单的分享!
爱生活、爱原创、爱分享!