查看原文
其他

Python数据挖掘第二个包——pandas包的常用用法

柯广 数据科学专栏 2022-10-15

前面介绍了numpy包在矩阵、线性代数等方面的基础应用,pandas包与numpy包配合使用可以发挥巨大的威力,正是有了pandas包,python做数据挖掘才有了可能与优势。


01

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对象也可以用,可见它们是相似的。


02

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


欢迎留言、提建议、意见,觉得不错,记得【点赞、分享】!

猜你可能喜欢

Python线性代数与统计基础——Numpy的简单应用

Python简单文本分析朱自清写《匆匆》的情感状态

基于梯度下降法的——线性回归拟合(二)

决策树之剪枝算法手动计算+R语言简单实现——(二)

终于等到你了!


再华丽的词藻也不过简单的分享!

爱生活、爱原创、爱分享!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存