美文网首页
python数据分析——pandas1

python数据分析——pandas1

作者: X_xxieRiemann | 来源:发表于2019-12-18 09:43 被阅读0次

1.1 Pandas基本介绍

Python Data Analysis LibraryPandas是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

import numpy as np
import pandas as pd

pandas中有两种常用的基本结构

  • Series
    • 一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List很相近。Series能保存不同种数据类型,字符串、boolean值、数字等都能保存在Series中。
  • DataFrame
    • 二维的表格型数据结构。很多功能与R语言中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。

1.2Pandas库的series类型

一维Series 可以用一维列表初始化:

s1 = pd.Series([1, 3, 5, np.nan, 6, 8])
print(s1)
# 0    1.0
# 1    3.0
# 2    5.0
# 3    NaN
# 4    6.0
# 5    8.0
# dtype: float64

默认情况下,Series的下标都是数字(可以使用额外参数指定),类型是统一的。

s2 = pd.Series([1, 3, 5, np.nan, 6, 8], index=['a', 'b', 'c', 'd', 'e', 'f'])
print(s2)
# a    1.0
# b    3.0
# c    5.0
# d    NaN
# e    6.0
# f    8.0
# dtype: float64

索引一数据的行标签

print(s1.index)
# RangeIndex(start=0, stop=6, step=1)

print(s2.index)
# Index(['a', 'b', 'c', 'd', 'e', 'f'], dtype='object')

print(s2.values)
# [ 1.  3.  5. nan  6.  8.]   np.array格式
print(s2[0])
# 1.0
print(s2['a'])
# 1.0

切片操作,和numpy差不多

print(s1[2:5])
# c    5.0
# d    NaN
# e    6.0
# dtype: float64

索引赋值:

s1.index.name = "索引"
print(s1)
# 索引
# a    1.0
# b    3.0
# c    5.0
# d    NaN
# e    6.0
# f    8.0
# dtype: float64
s1.index = list('abcdef')
print(s1)
# a    1.0
# b    3.0
# c    5.0
# d    NaN
# e    6.0
# f    8.0
# dtype: float64

这时候的切片不再是左闭右开,下面的写法和s1[0:3]等价

print(s1['a':'c'])
# a    1.0
# b    3.0
# c    5.0
# dtype: float64

1.3Pandas库的DataFrame类型

DataFrame则是个二维结构,这里首先构造一组时间序列,作为我们第一维的下标:

data = pd.date_range('20190101', periods=6)
print(data)
# DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
# #                '2019-01-05', '2019-01-06'],
# #               dtype='datetime64[ns]', freq='D')

然后创建一个DataFrame结构:

df = pd.DataFrame(np.random.randn(6, 4))
print(df)
#           0         1         2         3
# 0  1.021006  1.765719  1.776930  0.033001
# 1  0.078115 -0.784737  0.261904  0.853981
# 2  0.137149 -0.264794 -1.064713 -0.611104
# 3  1.691658  0.060301 -0.448528 -0.206958
# 4 -1.129160 -1.446600  0.387408  0.915638
# 5  1.553429  0.541750  1.135685 -0.314485
df = pd.DataFrame(np.random.randn(6, 4), index=data, columns=list('ABCD'))
print(df)
#                    A         B         C         D
# 2019-01-01 -0.403110 -0.676936 -1.597137 -1.726338
# 2019-01-02  0.821402  1.227160 -0.369561 -2.206953
# 2019-01-03 -0.492121  0.882169  0.834621 -0.110336
# 2019-01-04  1.567487 -1.213019  0.337903  0.756485
# 2019-01-05  2.359838 -1.142287 -0.164322 -0.598946
# 2019-01-06  0.359499  2.503660 -0.989103  0.229999

默认情况下,如果不指定index参数和columns,那么他们的值将用从0开始的数字替代。
除了向DataFrame中传入二维数组,我们也可以使用字典传入数据:

df2 = pd.DataFrame({'A': 1., 'B': pd.Timestamp('20190101'),
                    'C': pd.Series(1, index=list(range(4)), dtype=np.float),
                    'D': np.array([3]*4, dtype=np.int),
                    'E': pd.Categorical(['test', 'train', 'test', 'train']),
                    'F': 'abc'})
print(df2)
#      A          B    C  D      E    F
# 0  1.0 2019-01-01  1.0  3   test  abc
# 1  1.0 2019-01-01  1.0  3  train  abc
# 2  1.0 2019-01-01  1.0  3   test  abc
# 3  1.0 2019-01-01  1.0  3  train  abc

print(df2.dtypes)
# A           float64
# B    datetime64[ns]
# C           float64
# D             int32
# E          category
# F            object
# dtype: object

字典的每个key代表一列,其value可以是各种能够转化为Series的对象。
与Series 要求所有的类型都一致不同,DataFrame只要求每一列数据的格式相同:

查看数据

头尾数据

headtail方法可以分别查看最前面几行和最后面几行的数据(默认为5):

print(df.head())
#                    A         B         C         D
# 2019-01-01 -1.304602  2.043264 -2.365490  0.348898
# 2019-01-02 -0.332710 -0.836310  0.391643 -0.713681
# 2019-01-03  1.315738 -1.694673  1.071747 -0.496341
# 2019-01-04  0.043809  0.508175 -1.230306 -0.593911
# 2019-01-05  1.323222 -1.002346  1.038059 -0.171501

最后3行:

print(df.tail(3))
#                    A         B         C         D
# 2019-01-04  1.523261 -0.263010  0.913391  0.912008
# 2019-01-05 -0.894510  0.993565  0.141227  0.056933
# 2019-01-06  0.844139  0.185704 -0.070343  1.446769
下标,列标,数据

下标使用index属性查看:

print(df.index)
# DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
#                '2019-01-05', '2019-01-06'],
#               dtype='datetime64[ns]', freq='D')

列标使用columns属性查看:

print(df.columns)
# Index(['A', 'B', 'C', 'D'], dtype='object')

数据值使用values查看:

print(df.values)
# [[-0.58907961 -1.16911153  1.25560219 -0.49365279]
#  [-3.51588889 -0.62920317 -0.53742163 -0.22376674]
#  [ 0.70458103  0.17104868 -1.32613727  0.83896575]
#  [-0.52785699  1.87123803  0.87222562 -0.35988083]
#  [ 0.67600155  0.63398791  0.23750621  0.72273571]
#  [-0.3841158   0.52155693 -0.36270402 -0.48221057]]

1.4 Pandas读取数据及数据操作

我们将以豆瓣的电影数据作为我们深入了解Pandas的一个示例。


本地数据
df = pd.read_excel('豆瓣电影数据.xlsx')
print(df.head())
       名字      投票人数        类型    产地                 上映时间   时长    年代   评分  \
# 0  肖申克的救赎  692795.0     剧情/犯罪    美国  1994-09-10 00:00:00  142  1994  9.6   
# 1    控方证人   42995.0  剧情/悬疑/犯罪    美国  1957-12-17 00:00:00  116  1957  9.5   
# 2   美丽人生   327855.0  剧情/喜剧/爱情   意大利  1997-12-20 00:00:00  116  1997  9.5   
# 3    阿甘正传  580897.0     剧情/爱情    美国  1994-06-23 00:00:00  142  1994  9.4   
# 4    霸王别姬  478523.0  剧情/爱情/同性  中国大陆  1993-01-01 00:00:00  171  1993  9.4   
# 
#      首映地点  
# 0  多伦多电影节  
# 1      美国  
# 2     意大利  
# 3   洛杉矶首映  
# 4      香港  

行操作

# 显示第一行,
print(df.iloc[0])
# 名字                   肖申克的救赎
# 投票人数                 692795
# 类型                    剧情/犯罪
# 产地                       美国
# 上映时间    1994-09-10 00:00:00
# 时长                      142
# 年代                     1994
# 评分                      9.6
# 首映地点                 多伦多电影节
# Name: 0, dtype: object

也可以进行切片显示0到4行,print(df.iloc[0:5])
也可以使用loc,功能类似,但是在切片的时候不再是左闭右开,比如:
print(df.loc[0:5]),表示第0行到第5行。

添加一行
# 添加一行
dit = {'名字': '复仇者联盟3', '投票人数': '12345',
       '类型': '科幻', '产地': '美国', '上映时间': '2018-05-04',
       '时长': '144', '年代': '2018', '评分': '8.5', '首映地点': '美国'}
s = pd.Series(dit)
s.name = 38738  #新的最后一行
print(s)
# 上映时间    2018-05-04
# 产地              美国
# 名字          复仇者联盟3
# 年代            2018
# 投票人数         12345
# 时长             144
# 类型              科幻
# 评分             8.5
# 首映地点            美国
# Name: 38738, dtype: object
df = df.append(s)
print(df.tail(1))
#            名字   投票人数  类型  产地 上映时间   时长    年代   评分 首映地点
# 38738  复仇者联盟3  12345  科幻  美国  2018-05-04  144  2018  8.5   美国
删除一行
df = df.drop([38738])
print(df.tail(1))
# 名字 投票人数     类型  产地  \
# 38737  列宁格勒围困之星火战役 Блокада: Фильм 2: Ленинградский ме...   32  剧情/战争  苏联   
# 
#                       上映时间  时长    年代   评分 首映地点  
# 38737  1905-05-30 00:00:00  97  1977  6.6   美国 

列操作

print(df.columns)
# Index(['名字', '投票人数', '类型', '产地', '上映时间', '时长', '年代', '评分', '首映地点'], dtype='object')

print(df['名字'][:5])
# 0    肖申克的救赎
# 1      控方证人
# 2     美丽人生 
# 3      阿甘正传
# 4      霸王别姬

print(df[['名字', '类型']][:5])
#        名字        类型
# 0  肖申克的救赎     剧情/犯罪
# 1    控方证人  剧情/悬疑/犯罪
# 2   美丽人生   剧情/喜剧/爱情
# 3    阿甘正传     剧情/爱情
# 4    霸王别姬  剧情/爱情/同性
增加一列
df['序号'] = range(1, len(df)+1)
print(df[:5])
#        名字    投票人数        类型    产地                 上映时间   时长    年代   评分  \
# 0  肖申克的救赎  692795     剧情/犯罪    美国  1994-09-10 00:00:00  142  1994  9.6   
# 1    控方证人   42995  剧情/悬疑/犯罪    美国  1957-12-17 00:00:00  116  1957  9.5   
# 2   美丽人生   327855  剧情/喜剧/爱情   意大利  1997-12-20 00:00:00  116  1997  9.5   
# 3    阿甘正传  580897     剧情/爱情    美国  1994-06-23 00:00:00  142  1994  9.4   
# 4    霸王别姬  478523  剧情/爱情/同性  中国大陆  1993-01-01 00:00:00  171  1993  9.4   
# 
#      首映地点  序号  
# 0  多伦多电影节   1  
# 1      美国   2  
# 2     意大利   3  
# 3   洛杉矶首映   4  
# 4      香港   5  
删除一列
df = df.drop('序号', axis=1)

相关文章

网友评论

      本文标题:python数据分析——pandas1

      本文链接:https://www.haomeiwen.com/subject/muhqiqtx.html