pandas之数据存储

mmmjyjy 2020-05-29

pandas对象修改试图模式和副本模式
视图模式:多个变量指向同一个内存

  1. 修改一个变量另外一个变量也会改变
  2. 操作如:将一个对象整体赋值给另外一个变量

副本模式

  1. 修改一个变量,另外一个变量不会变
  2. 操作如:将一个对象查询的一部分赋值给另外一个变量

当一个对象整体赋值给另一个变量时,视图模式,2个变量对应的内存地址相同,修改一个变量,另外一个变量也会改变
当使用copy将一个变量赋值给另外一个变量

  1. 或者使用查询赋值,查询数据的一部分并赋值给其他 变量
  2. 当赋值为原数查询一部分时,是副本模式,修改一个变量不会影响另外一个变量
a_values = [
    [ "张秀英", 0, 82,171, 66,"阜新市",73],
    ["毛桂英", 1, 18, 173, 56,"金华市",70],
    [ "邵涛", 1,15, 163, 58, "滨州市",88],
    ["傅丽",1, 68,185,50,"秦皇岛市",81],
    ["宋秀兰",0,86,182, 79,"乌海市",68]
]
a = pd.DataFrame(a_values,index=[1,2,3,4,5],columns=[‘name‘,‘sex‘,‘age‘,‘heigh‘,‘weight‘,‘address‘,‘grade‘])

#视图模式 修改单元格内的值,a赋值给b时候,a,b同时指向一个地址,节省内存
b = a
b.loc[1, ‘name‘] = ‘bobby‘  # id(a) == id(b)

# 副本模式,方法分为2种
#使用copy赋值;最好使用copy副本模式赋值
c = a.copy()
c.loc[1,‘name‘] = ‘caruso‘
#查询数据的一部分赋值
d = a[[‘name‘,‘sex‘,‘address‘]]  # d = a[[‘name‘,‘sex‘,‘address‘]].copy() 优先使用这种方式
d.loc[1, ‘name‘] = ‘drose‘

链式调用:尽量避免链式调用方式修改,容易出错
  整体调用一次执行
  a.loc[0,‘name‘]
链式调用分开执行,影响效率;更改数据时候,轻度报警高,重度就是不成功
  a[‘name‘][0]
  a.loc[0][‘name‘]

pandas数据存储,数据的输入输出是基本操作
pandas可以存取多种介质类型数据
文本类数据

  • csv
  • json

二进制数据 (电脑上所有的数据都是2进制数据,高级显示利用编码显示)

  • excel
  • pkl
  • hdf5

数据库

  • sql

web api数据

  • html

其他

  • 内存

文本类数据文件读入pandas是会自动推断每列数据类型并转化
二进制类数据文件会在格式种存储数据类型
对pandas不能支持活不方便使用的数据格式,可以使用支持软件将其转化为csv或xlsx个时候使用pandas读写,如spss文件

csv comma-separated values逗号分隔以纯文本存储表数据的一种格式
二维表格数据结构,精简省空间,用于数据分析
json是多维数据格式,浪费空间,用于传输数据api

  • name,age,address,grade
  • liu,19,beijing,60
  • liu,19,‘beijing,chaoyang‘,60

写入csv

  • 默认utf-8模式
  • 保存其他格式可以自行设置参数encoding
  • 注意:execl打开utf-8的csv文件,中文会乱码,建议保存gbk

读取csv

  • 注意文本文件编码格式
  • utf-8默认支持
  • 其他编码,需要手动设置参数encoding
  • 注意utf-8格式的csv文件,excel读取时中文会乱码
pd.read_csv(‘test.csv‘,
            encoding=‘gb2312‘,
            sep=‘,‘,              #指定分隔符,csv默认是逗号,如果是table表格数据一般为\t 
            #列索引
#             header=0,            #默认将第一行设置为表头,其他行也可以
#             header=None,        # 不将第一行设为索引,列索引
#             header=[0,1,2],     #层次化索引
#             names=[‘姓名‘,‘性别‘,‘年龄‘,‘身高‘,‘体重‘,‘地址‘,‘成绩‘],     #配合header=0,自定义索引
            #行索引
#              index_col=None,                          #行索引,默认值none,不使用数据列,而是使用系统自带索引
#              index_col=0,                            #把第0行作为列索引
#              index_col=‘name‘,                      #name作为列索引
#              index_col=[0,1,2],                   #默认索引,多列层次化索引
#              index_col=[‘name‘,‘age‘],          #自定义索引多列
            #读取行列
#             usecols=[0,2,4],                        # 读取指定列,默认索引
#             usecols=[‘name‘,‘address‘],             #读取指定列,自定义索引
#             nrows=3,                                  #读取前几行
#             skiprows=3,                             #从表格开始算起忽略的行
#             skiprows=[2,4],                         #跳过2,4行
#             skipfooter=2,                          #从表格末尾忽略的行,必须配合engine=‘python’否则会报警
#             engine=‘python‘,                       #引擎c更快,python更完善
            # 替换空间
#             na_values=["乌海市"],                    # 将csv种某些字符替换成空值nan
#             keep_default_na=True,             # 默认True,同时使用系统自带的空值替换和自定义空值,如na,n/a False只使用自定义空值
#             encoding=‘utf-8‘,                  #默认utf-8, 引擎是python时候需要手动设置
    )
a_values = [
    [ "张秀英", 0, 82,171, 66,"阜新市",73],
    ["毛桂英", 1, 18, 173, 56,"金华市",70],
    [ "邵涛", 1,15, 163, 58, "滨州市",88],
    ["傅丽",1, 68,185,50,"秦皇岛市",81],
    ["宋秀兰",0,86,182, 79,"乌海市",68]
]
a = pd.DataFrame(a_values,index=[1,2,3,4,5],columns=[‘name‘,‘sex‘,‘age‘,‘heigh‘,‘weight‘,‘address‘,‘grade‘])

# 写入
a.to_csv(‘test1.csv‘,encoding=‘gbk‘)
a.to_csv(‘test2.csv‘,encoding=‘gbk‘,index=False) # 不保存行索引 header=False 不保存列索引不推荐
a.to_csv(‘test1.csv‘,encoding=‘gbk‘,columns=[‘name‘,‘age‘,‘grade‘]) # 保存指定的列

层次化索引查询

df = pd.read_csv(‘test.csv‘,header=[0,1,2],encoding=‘gbk‘)
df[‘name‘][‘张秀英‘][‘毛桂英‘][0]
df = pd.read_csv(‘test.csv‘,index_col=[0,1,2],encoding=‘gbk‘)
df.loc[[‘张秀英‘]].loc[‘张秀英‘].loc[0].loc[82][‘address‘]

相关推荐