当前位置: 代码迷 >> 综合 >> 【Data Mining】机器学习三剑客之Pandas常用用法总结(上)
  详细解决方案

【Data Mining】机器学习三剑客之Pandas常用用法总结(上)

热度:16   发布时间:2023-12-17 11:28:16.0

作者:陈老师 个人公众号:接地气学堂

陈老师新课:商业分析全攻略 https://edu.hellobi.com/course/308 用数据分析方法解决商业问题,目前已经100+学员加入!5星好评。分析思维双剑合璧,四大板块:概念篇、行业篇、思维篇、套路篇 

一、前言

看pandas之前我建议先看我的numpy总结,效果更佳。

【Data Mining】机器学习三剑客之Numpy常用用法总结

可以大概理解为numpy主要是用来生成数据,并且进行数据运算的工具

而pandas主要是用来整个数据的管理,也就是整个数据的摆放或是一些行列的操作等等。当然也不完全是这个样子。

二、下载、安装、导入

用anaconda安装是十分方便的,如果你已经安装了tf,keras之类的,其实已经直接把numpy安装了,一般来说安装就是pip命令。

1pip install pandas#py2

2pip3 install pandas#py3

用法则是

1importpandasaspd# 一般as为pd来操作

三、常用用法总结

1.Series

1# -*- coding: utf-8 -*-

2importpandasaspd

3importnumpyasnp

4

5df1 = pd.DataFrame(np.arange(12).reshape((3,4)))

6printdf1

7"""

80  1   2   3

90  0  1   2   3

101  4  5   6   7

112  8  9  10  11

12"""

13s = pd.Series([1,1,44,22])#创建一个series

14s_type_int_float = pd.Series([1,1,44,22], dtype=np.float32)#更改type

15s_type = pd.Series([1, np.nan,44,22])#np.nan就是就是Nan缺省值

16   #更改index

17s_index = pd.Series([1, np.nan,44,22], index=["c","h","e","hongshu"])

18print("s:")

19print(s)

20print("s_type_int_float:")

21print(s_type_int_float)

22print("s_type:")

23print(s_type)

24print("s_index:")

25print(s_index)

26"""

27s:

280     1

291     1

302    44

313    22

32dtype: int64

33

34s_type_int_float:

350     1.0

361     1.0

372    44.0

383    22.0

39dtype: float32

40

41s_type:

420     1.0

431     NaN

442    44.0

453    22.0

46dtype: float64

47

48s_index:

49c           1.0

50h           NaN

51e          44.0

52hongshu    22.0

53dtype: float64

54"""

一些说明:

series相当于dataframe的一个元素,pandas的主体数据类型为dataframe,一个series单位相当于dataframe的一行,当然是连带这整个dataframe的column和元素dtype的信息的。(ps:这里可以先记着,后面慢慢才能全都懂,先记住这么个关系,后面讲)

生成series的左面一列其实就是dataframe的每一列的index,例如上述s左面为[0, 1, 2, 3]其实就是和我上面写的那个dataframe的最上面的单独的一行对应,代表每一列的名字,有点像excel表格中的每一列的name。

上述采用list生成的series,理论上用array-like的形式都可以生成,当然numpy毋庸置疑可以后面会有展示,如果生成的series的list中的每个元素为整型,则dtype默认推理为int64,如果元素中海包括nan缺省值则按浮点数处理,所以默认为float64,可知如果都为浮点数则默认为float64。

如果要是自定义dtype和往常一样自然转换,整数化或者浮点化。

1# -*- coding: utf-8 -*-

2importpandasaspd

3importnumpyasnp

4

5s_np1 = pd.Series(np.arange(6))#利用numpy生成series的方法

6

7data_numpy = np.array([1,2,3,45], dtype=np.float32)

8s_np2 = pd.Series(data_numpy)

9

10data_numpy1 = np.array([1,2,3,45], dtype=np.int8)

11s_np3 = pd.Series(data_numpy1)

12

13data_numpy2 = np.array([1,2,3,45])

14s_np4 = pd.Series(data_numpy2)

15

16print(s_np1)

17print(s_np2)

18print(s_np3)

19print(s_np4)

20"""

210    0

221    1

232    2

243    3

254    4

265    5

27dtype: int64

280     1.0

291     2.0

302     3.0

313    45.0

32dtype: float32

330     1

341     2

352     3

363    45

37dtype: int8

380     1

391     2

402     3

413    45

42dtype: int64

43"""

上面这个主要看dtype,可知规律为通过numpy生成series时dtype跟随numpy的类型。

2、 DataFrame

①、df的index和colomns操作

1# -*- coding: utf-8 -*-

2importpandasaspd

3importnumpyasnp

4

5

6# 通过numpy生成随机0-10的shape为(3, 4)的dataframe

7df_np = pd.DataFrame(np.random.randint(low=0, high=10, size=(3,4)))

8print(df_np)

9

10# 生成随机-1-1的dataframe

11# 更改index

12df_index = pd.DataFrame(np.random.randn(3,4), index=['f','s','t'])

13print(df_index)

14

15# 更改column

16df_colums = pd.DataFrame(np.arange(12).reshape((3,4)), columns=['che','hong','shu','24'])

17print(df_colums)

18

19"""

200  1  2  3

210  2  3  0  3

221  7  0  5  8

232  0  5  2  7

24

250         1         2         3

26f -2.216776 -1.506733  0.870351  1.361973

27s  1.104645 -1.538397 -0.616963 -2.101459

28t -1.423237 -0.378047 -0.294814 -0.200800

29

30che  hong  shu  24

310    0     1    2   3

321    4     5    6   7

332    8     9   10  11

34"""

35

36#use dict to create dataframe

37dates_value = pd.date_range('20181222', periods=3)

38#dict的key对应于df的colomn

39df_dict = pd.DataFrame({'che':22.22,

40'hong': pd.Series(np.array([1,2,3], dtype=np.float32)),

41'shu': dates_value})

42print(df_dict)

43"""

44che  hong        shu

450  22.22   1.0 2018-12-22

461  22.22   2.0 2018-12-23

472  22.22   3.0 2018-12-24

48

这里需要注意的一点:dataframe中的colomn参数其实就是series中的index。

总结一下:

dataframe可以通过dict和numpy生成

主要设置参数为index和colomns, index为每行的名称,colomns为每列的,对应于每一行的series的index。

利用dict生成dataframe时,dict的keys对应于dataframe的colomns

②、df的各种属性

1importpandasaspd

2importnumpyasnp

3# pandas.Categorical

4#https://blog.csdn.net/weixin_38656890/article/details/81348539

5

6

7df2 = pd.DataFrame({'A':1.,

8'B': pd.Timestamp('20130102'),

9'C': pd.Series(1, index=list(range(4)), dtype='float32'),

10'D': np.array([3,6,9,12], dtype=np.int32),

11'E': pd.Categorical(["test","train","test","train"]),

12'F':'che'})

13print(df2)

14print(df2.dtypes)#return the data type of each column.

15"""

16A          B    C   D      E    F

170  1.0 2013-01-02  1.0   3   test  che

181  1.0 2013-01-02  1.0   6  train  che

192  1.0 2013-01-02  1.0   9   test  che

203  1.0 2013-01-02  1.0  12  train  che

21A           float64

22B    datetime64[ns]

23C           float32

24D             int32

25E          category

26F            object

27"""

28print(df2.index)

29print(df2.columns)

30"""

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

32Index([u'A', u'B', u'C', u'D', u'E', u'F'], dtype='object')

33"""

34print(df2.values)

35# 返回数据类型为numpy可知取出元素其中一个方法是变成list之后取出即可

36# 当然这个方法速度慢,有更好的内置取值的方法

37print(type(df2.values))

38"""

39[[1.0 Timestamp('2013-01-02 00:00:00') 1.0 3 'test' 'che']

40[1.0 Timestamp('2013-01-02 00:00:00') 1.0 6 'train' 'che']

41[1.0 Timestamp('2013-01-02 00:00:00') 1.0 9 'test' 'che']

42[1.0 Timestamp('2013-01-02 00:00:00') 1.0 12 'train' 'che']]

43

44"""

45# 数字类data的各种数学计算结果

46# 数量、平均、标准差、最小等 

47print(df2.describe())

48"""

49A    C          D

50count  4.0  4.0   4.000000

51mean   1.0  1.0   7.500000

52std    0.0  0.0   3.872983

53min    1.0  1.0   3.000000

5425%    1.0  1.0   5.250000

5550%    1.0  1.0   7.500000

5675%    1.0  1.0   9.750000

57max    1.0  1.0  12.000000

58"""

59

60"""

61原dataframe 方便对比观看

62A          B    C   D      E    F

630  1.0 2013-01-02  1.0   3   test  che

641  1.0 2013-01-02  1.0   6  train  che

652  1.0 2013-01-02  1.0   9   test  che

663  1.0 2013-01-02  1.0  12  train  che

67"""

68print(df2.T)#转置

69"""                     0         ...                             3

70A                    1         ...                             1

71B  2013-01-02 00:00:00         ...           2013-01-02 00:00:00

72C                    1         ...                             1

73D                    3         ...                            12

74E                 test         ...                         train

75F                  che         ...                           che

76"""

77print(df2.sort_index(axis=1, ascending=False))# axis=1 相当于colomn元素排序

78print(df2.sort_index(axis=0, ascending=False))# axis=0 相当于index排序

79#  其他value顺着index或者colomns排序即可

80"""

81F      E   D    C          B    A

820  che   test   3  1.0 2013-01-02  1.0

831  che  train   6  1.0 2013-01-02  1.0

842  che   test   9  1.0 2013-01-02  1.0

853  che  train  12  1.0 2013-01-02  1.0

86A          B    C   D      E    F

873  1.0 2013-01-02  1.0  12  train  che

882  1.0 2013-01-02  1.0   9   test  che

891  1.0 2013-01-02  1.0   6  train  che

900  1.0 2013-01-02  1.0   3   test  che

91"""

92print(df2.sort_values(by='E'))#通过colomn为E的单位的value来排序(如果是数字则按数字大小排列,字母按字母大小)

93"""

94A          B    C   D      E    F

950  1.0 2013-01-02  1.0   3   test  che

962  1.0 2013-01-02  1.0   9   test  che

971  1.0 2013-01-02  1.0   6  train  che

983  1.0 2013-01-02  1.0  12  train  che

99"""

3、select

  1# -*- coding: utf-8 -*-

  2importpandasaspd

  3importnumpyasnp

  4

  5dates = pd.date_range('20121222', periods=6)

  6df = pd.DataFrame(np.arange(24).reshape((6,4)), index=dates, columns=['A','B','C','D'])

  7#easy selection

  8print(df)

  9"""

10A   B   C   D

112012-12-22   0   1   2   3

122012-12-23   4   5   6   7

132012-12-24   8   9  10  11

142012-12-25  12  13  14  15

152012-12-26  16  17  18  19

162012-12-27  20  21  22  23

17"""

18# select 'A' colomn

19print(df['A'])

20print(df.A)

21"""

222012-12-22     0

232012-12-23     4

242012-12-24     8

252012-12-25    12

262012-12-26    16

272012-12-27    20

28Freq: D, Name: A, dtype: int64

292012-12-22     0

302012-12-23     4

312012-12-24     8

322012-12-25    12

332012-12-26    16

342012-12-27    20

35Freq: D, Name: A, dtype: int64

36"""

37# select 0-3 rows

38print(df[0:3])

39print(df['2012-12-22':'2012-12-24'])

40"""

41A  B   C   D

422012-12-22  0  1   2   3

432012-12-23  4  5   6   7

442012-12-24  8  9  10  11

45A  B   C   D

462012-12-22  0  1   2   3

472012-12-23  4  5   6   7

482012-12-24  8  9  10  11

49"""

50

51

52

53"""

54原dataframe, 适宜对比观看

55A   B   C   D

562012-12-22   0   1   2   3

572012-12-23   4   5   6   7

582012-12-24   8   9  10  11

592012-12-25  12  13  14  15

602012-12-26  16  17  18  19

612012-12-27  20  21  22  23

62"""

63# select by label= loc

64# 这里的label其实就是我之前说dataframe对应的colomn和index

65# 和平时的二维的numpy选取相似,只是把index转换为对应的label name

66

67print(df.loc['20121224'])#loc[]内单个一个label name时为行的index name

68print(df.loc[:,'A':'C'])# : 代表所有的行都要 逗号后面为colomns的label name

69"""

70A     8

71B     9

72C    10

73D    11

74Name: 2012-12-24 00:00:00, dtype: int64

75A   B   C

762012-12-22   0   1   2

772012-12-23   4   5   6

782012-12-24   8   9  10

792012-12-25  12  13  14

802012-12-26  16  17  18

812012-12-27  20  21  22

82"""

83print(df.loc[:, ['A','C']])

84print(df.loc['20121223', ['A','C']])

85"""

86A   C

872012-12-22   0   2

882012-12-23   4   6

892012-12-24   8  10

902012-12-25  12  14

912012-12-26  16  18

922012-12-27  20  22

93A    4

94C    6

95Name: 2012-12-23 00:00:00, dtype: int64

96"""

97

98"""

99原dataframe, 适宜对比观看

100A   B   C   D

1012012-12-22   0   1   2   3

1022012-12-23   4   5   6   7

1032012-12-24   8   9  10  11

1042012-12-25  12  13  14  15

1052012-12-26  16  17  18  19

1062012-12-27  20  21  22  23

107"""

108# select by position(index)= iloc

109# 这里的selection index其实就是完全和numpy相似

110# (row index, colomn index)

111# 利用行的索引和列的索引来取值

112print(df.iloc[3])

113print(df.iloc[3:5,1:3])

114print(df.iloc[[1,3],1:3])

115"""

116A    12

117B    13

118C    14

119D    15

120Name: 2012-12-25 00:00:00, dtype: int64

121B   C

1222012-12-25  13  14

1232012-12-26  17  18

124B   C

1252012-12-23   5   6

1262012-12-25  13  14

127"""

128

129# mixed selection = ix

130# label + position selection

131print(df.ix[1, ['A','D']])

132"""

133A    4

134D    7

135Name: 2012-12-23 00:00:00, dtype: int64

136"""

137# Boolean indexing

138# use bool to select

139print(df[df.B >9])

140"""

141A   B   C   D

1422012-12-25  12  13  14  15

1432012-12-26  16  17  18  19

1442012-12-27  20  21  22  23

145"""

一些总结:

一种选择数据有五种:简单直接选取,label选取(loc),index选取(iloc),混合选取(ix),真假选取

其实第二种到第四种选取,有规律可言,其实都是[row,colomn]的组合而已,只是一个是用label name,一个是index name,混合是label or index

第一种其实就是label或者index的单列或者行选取,但是也有特殊表达比如df.A

最后一种主要用于删选数据的。

4、读取文件,输出文件

在使用中主要针对于excel文件和csv文件,个人推荐csv文件,因为在很多比赛和项目中都采用此类型,主要是兼容性好一些,我在linux下使用excel问题很多,当然对于pandas两样的使用很相似。

首先我们采用常用的机器学习数据集:iris数据集,链接如下

3901436-33d845464fdeafda

数据集简单介绍:鸢尾花的特征作为数据来源,数据集包含150个数据集,分为3类,每类50个数据,每个数据包含4个属性,数据集iris.csv截图如下。

3901436-23d5eef4378df60c

数据集内容

此处进行简单读入,并按照算法输入进行简单处理,并输出

1importpandasaspd

2importnumpyasnp

3# 读csv文件

4Iris_dataset = pd.read_csv("./Iris_dataset/iris.csv")

5# 给每列一个column label

6Iris_dataset.columns = ['data_index','sepal_len','sepal_width','petal_len','petal_width','class']

7# drop掉第一列(无用的列,表示数据index)

8Iris_dataset.drop(columns='data_index', axis=1, inplace=True)

9# 判断是否存在nan

10ifnp.any(Iris_dataset.isnull()) ==True:

11print("有空缺值")

12Iris_dataset.dropna()

13else:

14print("无空缺值")

15# 进行把string label name转换为int型

16deffun(x):

17ifx =='setosa':

18return0

19elifx =='versicolor':

20return1

21elifx =='virginica':

22return2

23Iris_dataset['class'] = Iris_dataset['class'].apply(lambdax: fun(x))

24# 前五条数据

25print(Iris_dataset.head())

26# 输出.csv文件

27Iris_dataset.to_csv('iris_handle_data')

输出文件如下:

3901436-30c89b2e56997322

输出结果

主要输出输入,我建议使用.csv数据,若使用excel文件函数如下

1p = pd.read_excel()

2p.to_excel()

  相关解决方案