【小旭学长-使用python进行城市数据分析】笔记篇(中)

本文是【小旭学长-使用python进行城市数据分析】笔记篇的中篇,主要介绍了Pandas数据处理的基础知识,包括数据编码和储存格式,如CSV、JSON、pickle,以及数据表的读写、行列处理、合并、连接、聚合统计和遍历等操作。详细讲解了数据的读取、存储、基本操作,如查看行列名、改变行列名、以列名读取数据等,还涉及了数据的合并、连接、聚合和遍历等高级功能。此外,文章提供了多个练习题目,帮助读者巩固所学知识。
摘要由CSDN通过智能技术生成

2021.11.8
【小旭学长-使用python进行城市数据分析】说明篇(开篇 )https://blog.csdn.net/wistonty11/article/details/121347825
【小旭学长-使用python进行城市数据分析】笔记篇(上):https://blog.csdn.net/wistonty11/article/details/121089882
【小旭学长-使用python进行城市数据分析】笔记篇(中):https://blog.csdn.net/wistonty11/article/details/121210664
【小旭学长-使用python进行城市数据分析】笔记篇(下):https://blog.csdn.net/wistonty11/article/details/121308188

三. Pandas数据处理基础

3.1 数据的编码和储存格式

  • Pandas中默认读取文件的编码格式为UTF-8,否则会出现乱码

CSV

  • CSV是一种纯文本格式,EXCEL和Python都对其支持

  • CSV数据中的字段,记录均为英文逗号,隔开

  • CSV每一条记录 都有相同数量的字段
    在这里插入图片描述

  • TSV与CSV区别是:TSV使用制表符(tab,\t)分割数据值

json

  • json由数值,字符串,列表,字典等等数据类型资有嵌套在一起构成
{
   “a”:1, "b":[1, 2, 3]}
[1,2,"3", {
   "a" : 4}]
3.14
  • json可以保存成.json后缀的文件,它是一纯文本格式,可以用txt打开
# 将data数据写到data.json文件中

data = {
   “a”:1, "b":[1, 2, 3]} # 混乱的格式

import json # 导入json包
f = open(“data.json”,mode = “w”) # 新建一个json文件data。w是写 r是读 a是往后加
# 并把这个文件写操作 设成变量f。 

json.dump(data, f) # 用json包里dump方法 将数据data 操作f方法,写到data.json
f.close()# 关闭文件操作,防止一直站着资源
# 读文件
f = open(“data.json”,mode = “r”)
data1 = json.load(f)
f.close()

data1 # {“a”:1, "b":[1, 2, 3]}

pickle文件

  • pickle能够将ptrhon中的对象,变量都以本地文件袋形式存储,后缀.pkl
  • pickle文件非文本,将文件用于编辑器打开则是乱码,不同python版本打开pickle可能会报错
  • 读写效率比CSV文件高
# 写
data = {
   “a”:1, "b":[1, 2, 3]} # 混乱的格式

import pickle
f = open(“data.pkl”,mode = “wb”) # w报错,以比特形式写,所以wb
# 并把这个文件写操作 设成变量f。 

pickle.dump(data, f) # 用json包里dump方法 将数据data 操作f方法,写到data.json
f.close()# 关闭文件操作,防止一直站着资源
# 读文件
f = open(“data.pkl”,mode = “rb”) # r报错,以比特形式写,所以rb
data2 = pickle.load(f)
f.close()

data2 # {“a”:1, "b":[1, 2, 3]}

3.2 数据表的行列处理

3.2.1 读操作

sep=“符号”来切割字符

import pandas as pd

a = pd.read_csv(r"新建文本文档.csv" )
a
列1 列2 列3
0 1 2 3
1 2 4 5
2 6 7 9
a1 = pd.read_csv(r"新建文本文档.csv", sep=",") # sep来指导 以什么做分界线
a1
  • 效果一样,因为本身CSV就是以切割数据的

【tsv】:以Tab切割数据

b = pd.read_csv("新建文本文档_1.tsv")
b
列1\t列2\t列3
0 1\t2\t3
1 2\t4\t5
2 6\t7\t9

【tsv】

b1 = pd.read_csv("新建文本文档_1.tsv", sep = "\t")
b1
列1 列2 列3
0 1 2 3
1 2 4 5
2 6 7 9

3.2.2 存储

index = None 不存储行号

#存储csv文件
b1.to_csv(r'新建文本文档_1.csv',index = None,encoding = 'utf-8_sig') #  index = None 不存储行号
pd.read_csv(r'新建文本文档_1.csv')
列1 列2 列3
0 1 2 3
1 2 4 5
2 6 7 9
  • 默认存行号
b1.to_csv(r'新建文本文档_2.csv',encoding = 'utf-8_sig') #  默认存行号
pd.read_csv(r'新建文本文档_2.csv')
Unnamed: 0 列1 列2 列3
0 0 1 2 3
1 1 2 4 5
2 2 6 7 9

【Excel和pickle】

#读取excel文件
pd.read_excel(r'untitled_1.xlsx')

#读写pickle文件
pd.read_pickle
data.to_pickle

3.2.3 写入数据三种形式

① 方式一:双层list

#方式1
data = pd.DataFrame([['aa',1],
              ['bb',2],
              ['cc',3]])
data.columns = ['name','type']
data


# 或者 列名直接写到DataFrame中
data = pd.DataFrame([['aa',1],
              ['bb',2],
              ['cc',3]],columns = ["name","type"])
name type
0 aa 1
1 bb 2
2 cc 3

② 方式二:一个list中包含多个字典

#方式2
pd.DataFrame([{
   'name':'aa','type':1},
{
   'name':'bb','type':2},
{
   'name':'cc','type':3}])
name type
0 aa 1
1 bb 2
2 cc 3
  • 方式2 如果有个列名不同,空的用NaN补齐
#方式2 如果有个列名不同
pd.DataFrame([{
   'name':'aa','type':1},
{
   'name1':'bb','type':2},
{
   'name':'cc','type':3}])
name type name1
0 aa 1 NaN
1 NaN 2 bb
2 cc 3 NaN

③ 方式三:一个字典,键值对中的值为list

#方式3
pd.DataFrame({
   'name':['aa','bb','cc'],'type':[1,2,3]})
name type
0 aa 1
1 bb 2
2 cc 3

【总结】 DataFrame()是个函数,要么双中括号,先给数据再给列名;要么输入一个中括号list,;里面是键值对字典;或者是给个字典,一个键对应多个数据值;

3.2.4 基本操作

3.2.4.1 查看行列名

# 查看列名 切记 不是columns()
data.columns 
Index(['name', 'type'], dtype='object')
# 查看行名
list(data.index)
[0, 1, 2]

3.2.4.2 改变行列名

# 改变列名
data.columns=["a",22]
data

# 同理 行名 data,indax = [1,2,3]
a 22
0 aa 1
1 bb 2
2 cc 3
# 行名变成其中一列
data.reset_index()
index a 22
0 0 aa 1
1 1 bb 2
2 2 cc 3
  • drop = True重新算行号
# data.reset_index(drop = True) 重新算行号

data.reset_index(drop = True)
a 22
0 aa 1
1 bb 2
2 cc 3

3.2.4.3 以列名读取数据

  • 已列名读取数据时,[ ]读取的是series格式,[[ ]]读取的DataFrame格式
# 取列 文件名【列名】 类型series

data["a"]
0    aa
1    bb
2    cc
Name: a, dtype: object
# 两层中括号取出的是字表 类型DataFrame
data[["a"]]
a
0 aa
1 bb
2 cc
  • 取出多列 双中括号 +
data[["a",22]]
a 22
0 aa 1
1 bb 2
2 cc 3
  • 可以取出重复的列
data[["a",'a']]
a a
0 aa aa
1 bb bb
2 cc cc

3.2.4.4 取行

  • 取行.loc用行名取 .iloc以行数取
# 取行 .loc用行名取 .iloc以行数取
data.index = ["a","b","c"]
data
a 22
a aa 1
b bb 2
c cc 3
data.iloc[1]
a     bb
22     2
Name: b, dtype: object
data.loc["b"]
a     bb
22     2
Name: b, dtype: object
  • ilocloc取出的都是series类
  • 取某几行,用切片
# 某几行 可以切片 也可以
data.iloc[0:2]
a 22
a aa 1
b bb 2

3.2.4.5 输出某一个值

# 输出某一个值
data["a"].iloc[2] 

或者

data.iloc[2]["a"]
'cc'

3.2.4.6 支持列运算,支持运算符

data[22] = data[22]*2
data
a 22
a aa 4
b bb 8
c cc 12
data[22] = data[22]>7
data
a 22
a aa False
b bb True
c cc True
# 条件筛选
data[data[22]==True]
a 22
b bb True
c cc True
  • 反向运算符
data[-data[22]==True]
a 22
a aa False
  • 行和列都满足的条件 前面是行
# 行和列都满足的条件 前面是行
data.loc[-data[22]==True,"a"]
a    aa
Name: a, dtype: object
data.loc[-data[22]==True,"a"]=2
data
a 22
a 2 False
b bb True
c cc True
  • astype()转换类型
# 用 astype()转换类型
type(data["a"].loc['a'])
int
type(data["a"].astype(str).loc['a'])
str

3.3 合并 连接 聚合统计 遍历

import pandas as pd

data1 = pd.DataFrame([["aa", 1],
                  ["bb", 2],
                  ["cc", 3]],columns=["name", "type"])
data1
name type
0 aa 1
1 bb 2
2 cc 3
data2 = pd.DataFrame([["dd", 1],
                  ["ee", 2],
                  ["ff", 3]])
data2.columns=["name", "type"]
data2
name type
0 dd 1
1 ee 2
2 ff 3

3.3.1 合并(concat 和 append)

  • 合并concat ()方法合并
    在这里插入图片描述
# 合并concat 
pd.concat([data1, data2])
name type
0 aa 1
1 bb 2
2 cc 3
0 dd 1
1 ee 2
2 ff 3

名字相同的接在一起,没有的用NaN

# 名字相同的接在一起
data3 = pd.DataFrame([["dd", 1],
                  ["ee", 2],
                  ["ff", 3]])
data3.columns=["name1", "type"]
data4 = pd.concat([data1, data3])
data4
name type name1
0 aa 1 NaN
1 bb 2 NaN
2 cc 3 NaN
0 NaN 1 dd
1 NaN 2 ee
2 NaN 3 ff
  • .append()方法合并

如果是data1 非常大 data2小,那么用append方法会省时

# 方法二 在data1后面追加data2 效果一样
# 如果是data1 非常大 data2小,那么用append方法会省时
data1.append(data2)
name type
0 aa 1
1 bb 2
2 cc 3
0 dd 1
1 ee 2
2 ff 3
  • 取某行数据用切片,因为只是某一行,那么类型是series.
data4.iloc[0:1]
name type name1
0 aa 1 NaN
data4.iloc[0]
name      aa
type       1
name1    NaN
Name: 0, dtype: object
# 表连接操作方法一 现在数组里加,推荐方法 速度比较快
results = []
for i in range(len(data4)):
    result = data4.iloc[i:i+1] # 这样才是取的整行
    results.append(result)
pd.concat(results) # 这里面 原本 应该每次用append都有一行 name type name1,因为用了 concat 同列名合并了
name type name1
0 aa 1 NaN
1 bb 2 NaN
2 cc 3 NaN
0 NaN 1 dd
1 NaN 2 ee
2 NaN 3 ff
# 表连接操作方法二,用dataFrame格式来存储,有些差别
results = pd.DataFrame
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羊老羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值