【02】数据类型、导入和输出

一、基本的数据类型

Python的数据类型与R语言的数据类型存在着一些差异。通常来说,Python常用的数据类型有:

  • 列表list
  • 字典dict
  • 元组tuple
  • 字符串' '
  • 数组array
  • 数据框DataFrame
  • 序列Series

其中,数组、数据框和序列则分别需要用到Numpy库和Pandas库

1.1 列表(list)

1.1.1 创建方法

list是python中最常见的数据类型,可以简单理解成R语言中的向量类型。一般而言,创建list的方式有两种:

  • 使用list函数
  • 使用方括号
mylist1 = list('abcd')
mylist1
['a', 'b', 'c', 'd']

使用list函数指定时,往往会将括号内的参数进行拆分并写入到一个新的列表中,因此这种方法往往可以用直接指定可以拆分的字符串类型,生成字符串列表。
但通常情况来说,使用方括号来创建列表也较为常见,不需要写出list函数直接将内容用逗号分开后写入到方括号内即可

mylist2 = [1,2,3,4,5,'hello', 'world']
mylist2
[1, 2, 3, 4, 5, 'hello', 'world']

1.1.2 列表的常用方法

在Python中的“方法”的概念也可以简单理解为函数,虽然在表现形式上和通常意义上的函数有所不同,但是本质上不同类型所具有的方法实际上也发挥着特定函数的功能,主要有以下几个:

  • 增加
    • append
    • insert
    • extend
  • 删除
    • pop
    • remove
  • 排序
    • sort

增加

append故名思义即追加的意思,因此直接会在列表后面直接进行增加

mylist3 = [1,2,3]
mylist3.append(4) #直接在原数据的尾部增加4
mylist3
[1, 2, 3, 4]
insert表示插入的意思,因此比append多一个步骤就是需要指定插入元素的索引位置(参见后面有关索引的内容);并且insert可以在列表的任意位置中增添,而不像append只能直接在尾部增加新元素。
insert表示插入的意思,因此比append多一个步骤就是需要指定插入元素的索引位置(参见后面有关索引的内容);并且insert可以在列表的任意位置中增添,而不像append只能直接在尾部增加新元素。
mylist3.insert(4, 'helloworld') #指定插入位置4
mylist3

extend表示延伸、延长的意思,因此这往往直接用来将一个列表加入到另一个列表的尾部,简单理解就像是一节节相连的火车箱;虽然extend也是在列表的尾部追加,但是和append有所不同的是:

  • extend方法是直接将其他列表中的元素添加到要加入的列表中
  • append方法仅仅只是在尾部追加,如果添加的是列表,不会将列表的元素直接追加
mylist4 = [1,2,3,4]
mylist5 = [1,2,4,4]
mylist4.extend([5,6,7,8])
mylist5.append([5,6,7,8])
print(mylist4, mylist5, sep='\n') #sep='\n'表示以行为单位输出打印

可以对三种方法进行一个简单的区分,以便理解:

  • append:直接在列表的尾部进行追加元素或列表
  • insert:可以在列表的任意位置追加,但需要指定插入位置
  • extend:直接在尾部进行追加,但追加的只能是列表,即使列表只包含一个元素
    但需要注意的是,三种方法都会直接在原数据上进行修改。因此如果不想修改原数据的,则需要使用copy方法来将原数据进行复制并赋值给新变量后再进行修改

删除

pop方法和insert有些相似,需要指定删除的元素位置,默认为尾部。一次只能指定一个位置并删除一个对象

mylist6 = [1,2,3,4]
mylist6.pop(0) #指定元素1的索引位置
mylist6

remove表示移除的意思,但其参数是移除列表中的某个值。

mylist6.remove(2) #移除列表中的元素2
mylist6

对于删除的方法,可以简单理解为insert方法的拆分,pop是根据元素的位置进行删除,remove直接删除列表中的元素

排序

sort方法可以直接用来对列表按从小到大排序,但其中sort的reverse参数则是从大到小

mylist7 = [2,1,7,8,5,6]
mylist7.sort()
mylist7
mylist7 = [2,1,7,8,5,6]
mylist7.sort(reverse=True)
mylist7

1.2 字典(dict)

1.2.1 创建方法

字典是Python中特别的数据类型,一般以“键-值”对的形式出现。对于字典的理解可以直接理解成我们小学使用的中华词典,根据首字母(键)进行找到每个字的相关内容(值)。同列表一样的,创建方法也有两种形式:

  • 花括号创建
  • 使用dict函数创建

使用花括号创建时,键(key)需要用双引号指定,并且在键的后面加上冒号与值相连。

mydict1 = {'Name':'张三',
               'Age':35,
               'telephone':123456}
mydict1

当然,如果像用R语言的数据框形式来输入而省去输入引号和冒号的麻烦,可以直接使用dict函数来创建字典。

mydict2 = dict(
    Name = '李四',
    Age = 40,
    Telephone = 123456
)
mydict2

使用dict函数来生成字典的方式更为通俗易懂,而且可以提高输入的效率;字典中的内容可以是数值、列表或者甚至是另外一个字典。如果是多个字典组成的字典,通常称为“JSON”格式的数据类型,但是这种数据类型需要额外的模块或库来进行处理。

1.2.2 常用方法

字典的常用方法和列表的部分方法有重合的地方,但是由于字典的形式和列表有所不同,因此也存在着字典类型特有的方法。

  • 增加:update
  • 删除:
    • pop
    • popitem
  • 键和值:
    • items
    • keys
    • values
    • get

增加

追加字典的方法可以update方法,update表示更新的意思。这一方法需要指定新的键值对;除此之外,在后面的章节中还可以通过索引的方式来进行追加。如果需要增加多个键-值对,那么直接可以创建一个新字典后直接使用update加入,这就有些类似列表的extend方法

mydict1.update({'Gender':'男'})
mydict1

删除

list的pop方法同样适用于list,因此使用pop可以指定要删除元素的位置,只是这次位置的索引等价于键

mydict1.pop('Gender')

popitem方法是pop方法的另一种延伸,适用于字典类型。故名思义就是从键中删除某个值,但需要注意的是,这一方法是在字典中随机删除某一键-值对。

mydict1.popitem()

键-值方法

由于字典是由一组组键-值对构成,因此也存在着相应的方法可以查看字典的键-值对。items方法是直接返回字典里所有的键-值对

mydict2.items()

keys表示键,因此keys方法可以直接返回字典里每一组键值对中的键有哪些

mydict2.keys()

values表示值,因此就是返回每组键值对中的值

mydict2.values()

对于上述三个函数,可以简单理解为 keys+values=items,即每一组键-值对才构成一个项目。因此使用其中的特定部分就会获取相应部分的相关信息。

如果想要查找特定键下的值有哪些,那么则需要get方法。get方法可以将键传入字典后搜索并返回值

mydict2.get('Name')

1.3 元组(tuple)

Python中的元组如果仅从形式上看,和R语言中的用括号表示的向量几乎相差无几;同时元组看起来和列表十分相似,但是元组和列表最大的区别就在于:列表可以修改,而元组不可修改

正因为元组这种不可修改的特性,使得元组可以很好保护重要或者关键的数据不容易被轻易修改。在很多函数中也会使用元组作为传入参数

1.3.1 创建方法

和列表、字典一样,元组一样有两种方法可以创建:

  • 括号
  • tuple函数

通常使用括号就直接可以生成一组元组:

mytuple1 = (1,2,3,4,'helloworld')
mytuple1

同样的,tuple的用法也类似于list

mytuple2 = tuple('abcd')
mytuple2

1.3.2 元组的常用方法

由于元组具有不可修改的特性,因此一般的增、删操作都无法使用,只能简单地对元组内所包含的元素信息进行查看:

  • 计数count
  • 索引index
mytuple3 = (1,3,3,'a','b')
mytuple3.count(3)

使用index可以直接返回元素所在的索引位置

mytuple3.index('a')

1.4 字符串

Python中的字符串和R语言中的字符串类型基本相似,但是需要注意的是Python中的字符串和元组一样,同样是不可改变的,但却可以像列表一样参与到循环当中进行循环迭代

1.4.1 创建方法

在Python中创建字符串和R语言类似,只需要用引号来包含即可生成字符串:

my_string = 'Hello world!'
my_string
'Hello world!'

1.4.2 字符串的方法

字符串由于不可修改,因此增删的相关方法也就不存在了。但是字符串的用途较为广泛,因此也存在着一系列丰富的方法

  • 字符统计:count
  • 分割字符:split
  • 大小写:
    • 小写:lower
    • 大写:upper
    • 首字母大写:capitalize、title
  • 替换:replace
  • 空格删除
    • 全删除:strip
    • 左删除:lstrip
    • 右删除:rstrip

count方法可以统计字符串中某个字符的频数

my_string.count('l')
3

使用split可以直接将字符串分割,这和R语言中的strsplit函数相一致。可以通过sep来指定分隔符。

my_string.split()
['Hello', 'world!']
my_string1 = 'Hello, world;Hello, Python'
my_string1.split(sep=';')
['Hello, world', 'Hello, Python']

大小写的转换和R语言tolowertoupper等函数相对应

lower_string = my_string.lower() #全部字符小写,等价于R语言中的tolower()
upper_sting = my_string.upper() #全部字符大写,等价于R语言中的toupper()
capital_string = my_string.capitalize() #首字母大写
title_string = my_string.title() #每个单词的首字母大写
print(lower_string, upper_sting, capital_string, title_string, sep='\n')
hello world!
HELLO WORLD!
Hello world!
Hello World!
my_string.capitalize()
'Hello world!'

对于字符串对象还提供了基本的替换操作(replace),可以简单理解为我们再Word或者Excel中的替换流程。这仅仅只是简单的、基本的字符串替换;如果想要对复杂的字符串进行替换,那么可能需要借助re库使用正则表达式来进行字符串的内容获取或替换操作。

my_string.replace('world', 'Python') #第一个参数为old(旧字符串),第二个参数为new(新字符串)
'Hello Python!'

使用strip方法可以直接将字符串中的左右两边的空格给去除,使用l(left)或r(right)则分别删除左边的空格或右边的空格

my_string2 = '    Hello, World    '
my_string2
'    Hello, World    '
strip_string = my_string2.strip()
lstrip_string = my_string2.lstrip()
rstrip_string = my_string2.rstrip()
print(strip_string, lstrip_string, rstrip_string, sep='\n')
Hello, World
Hello, World    
    Hello, World

二、其他类型

2.1 Numpy中的array数组

Numpy是数据分析和处理常用库之一,它也提供了类似于R语言中matrix矩阵和array数组的一种数据类型,即ndarray

import numpy as np  #通常np往往用于numpy的别称,在数据分析中通常人们都约定俗成的对以下几个库使用同样的别称
                              #import pandas as pd
                              #import matplotlib.pyplot as plt
                              #import seaborn as sns

2.1.1 数组的创建方法

在使用相关库的方法或函数时,往往需要先事先调用实现定义好的别称后再使用相应方法。直接向array方法传入列表即可生成一个数组对象

my_array1 = np.array([1,2,3,4])
my_array1
array([1, 2, 3, 4])

当然,还可以传入嵌套的列表序列

my_array1 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
my_array1
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

除此之外,np还有一个高级版的array数组,即多维数组对象ndarray,但是不同于array的是,ndarray传递的是相关的形状维度(shape)

my_array2 = np.ndarray(shape=[2,2])
my_array2
array([[1., 1.],
       [1., 0.]])

关于数组的方法较多,并且也兼容了许多Python内置的方法;可以通过jupyter的自动补全来一一尝试

2.2 Pandas中的Series和DataFrame

2.2.1 Series序列

Pandas也是数据分析和处理的常用包之一,并且Pandas也是在Numpy基础上发展出来的,所以Pandas库中的许多方法基本上都兼容Numpy的方法。同时也提供了其他许多Numpy库所不具备的功能,可以简单理解为R语言中的tidyverse集合库,使得数据分析和处理可以更加简单和快捷

import pandas as pd

Series是Pandas库中特有的一种数据类型,是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。可以通过调用Series方法来直接生成序列:

my_series = pd.Series([1,2,3])
my_series
0    1
1    2
2    3
dtype: int64

如果不在生成序列时指定索引,Series则会默认分配数字来作为索引;当然也可以直接在方法中指定生产的索引列和数据类型等

my_series2 = pd.Series([1,2,3,], index=list('abc'), dtype=float)
my_series2
a    1.0
b    2.0
c    3.0
dtype: float64

使用index和values可以分别查看序列的索引和值

print(my_series2.index, my_series2.values, sep='\n')
Index(['a', 'b', 'c'], dtype='object')
[1. 2. 3.]

2.2.2 DataFrame数据框

Pandas中的DataFrame数据框概念其实就是沿用R语言的data.frame()概念发展而来的,因此就可以直接将Pandas中的数据框看成是R语言里的数据框概念。数据框的生成也较为简单,可以直接使用DataFrame方法即可

my_dict1 = dict(names=['Jobs', 'Jack'], ages=[40, 50], gender=['M', 'M'])
my_df = pd.DataFrame(my_dict1)
my_df

通常来说可以直接将字典转化为数据框的内容,其中键就作为了每列的变量名

三、数据导入与输出

总的来说,数据导入的来源主要有以下几种:

  • 通用格式数据导入:txt、csv、xls、xlsx等
  • 数据库数据导入
  • 其他软件格式数据导入:比如.dta(Stata格式)、.sav(spss格式)、.sas7bdat或xpt(sas格式)等

Pandas库提供了一系列的数据的IO(Input & Output)方法,导入的方法通常都带有read_前缀,而导出的方法通常都带有to.的前缀

3.1 通用格式

pd.read_table() #等价于R语言中的read.table()
pd.read_csv() #等价于R语言中的read.csv()
pd.read_excel() #R语言中没有直接读取Excel格式的函数,
                      #需要借助readxl包中的read_excel相关函数来读取(或haven包和xlsx包的其他函数)

需要注意的是,导出时不需要指定Pandas库,而是在存在于Python环境中的数据后面直接调用即可

df.to_table() #等价于R语言的write.table()
df.to_csv() #等价于R语言的write.csv()
df.to_excel() #在R语言中貌似只能使用xlsx包write.xlsx()函数来进行导出

3.2 数据库数据

Python中存在了好几个关于SQL类数据库的库,这里只以Pandas的官方文档为参考。但无论是在R语言中还是在Python中,通过数据库来导入数据或进行操作的步骤一般如下:

  • 建立与数据库的联系:Connection
  • 读取数据库的相关数据
  • 查询操作
  • 写入操作等

首先先来看看R语言的连接方式

library(RMySQL)  #使用RMySQL库
conn < -dbConnect(
    MySQL(),
    dbname='database_name',
    username='root',  #默认用户名为root
    password='password',  #如果没有设定密码则为空
    host='127.0.0.1',  #默认是本地的127.0.0.1
    port=3306)  #默认本地端口3306

了解了基本登陆信息后再看看python是如何操作的

import pandas as pd
from sqlalchemy import create_engine
import pymysql

engine = create_engine('mysql+pymysql://root:934804@localhost:3306/python_test'
                       )  #需要注意的是root后面接的是密码(如果有)

pandas提供了几个关键的数据库方法:

  • read_sql_table(table_name, connection) #读取SQL数据库中的某个数据表
  • read_sql_query(sql, connection) #SQL查询操作
  • read_sql(sql, connection) #读取SQL某个数据库
  • DataFrame.to_sql(name, connection) #将Python运行环境中的数据写入SQL数据库中
sql = '''
      select * from scores;
      '''
df = pd.read_sql_query(sql, engine)
df

3.3 其他格式数据

pandas貌似没有提供读取SPSS数据的方法,因此如果需要读取SPSS数据还需要借助其他的库来进行

pd.read_stata() 
pd.read_sas()

除了Stata格式支持导出外,sas格式并不支持导出

df.to_stata()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容