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 】
【json 】
json由数值,字符串,列表,字典等等数据类型资有嵌套在一起构成
{
“a”: 1 , "b" : [ 1 , 2 , 3 ] }
[ 1 , 2 , "3" , {
"a" : 4 } ]
3.14
json可以保存成.json后缀的文件,它是一纯文本格式,可以用txt打开
data = {
“a”: 1 , "b" : [ 1 , 2 , 3 ] }
import json
f = open (“data. json”, mode = “w”)
json. dump(data, f)
f. close()
f = open (“data. json”, mode = “r”)
data1 = json. load(f)
f. close( )
data1
【pickle文件 】
pickle能够将ptrhon中的对象,变量都以本地文件袋形式存储,后缀.pkl
pickle文件非文本,将文件用于编辑器打开则是乱码,不同python版本打开pickle可能会报错
读写效率比CSV文件高
data = {
“a”: 1 , "b" : [ 1 , 2 , 3 ] }
import pickle
f = open (“data. pkl”, mode = “wb”)
pickle. dump(data, f)
f. close()
f = open (“data. pkl”, mode = “rb”)
data2 = pickle. load(f)
f. close( )
data2
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= "," )
a1
【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
不存储行号
b1. to_csv( r'新建文本文档_1.csv' , index = None , encoding = 'utf-8_sig' )
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】
pd. read_excel( r'untitled_1.xlsx' )
pd. read_pickle
data. to_pickle
3.2.3 写入数据三种形式
① 方式一:双层list
data = pd. DataFrame( [ [ 'aa' , 1 ] ,
[ 'bb' , 2 ] ,
[ 'cc' , 3 ] ] )
data. columns = [ 'name' , 'type' ]
data
data = pd. DataFrame( [ [ 'aa' , 1 ] ,
[ 'bb' , 2 ] ,
[ 'cc' , 3 ] ] ,columns = [ "name" , "type" ] )
name
type
0
aa
1
1
bb
2
2
cc
3
② 方式二:一个list中包含多个字典
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
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
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 查看行列名
data. columns
Index(['name', 'type'], dtype='object')
list ( data. index)
[0, 1, 2]
3.2.4.2 改变行列名
data. columns= [ "a" , 22 ]
data
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
data. reset_index( drop = True )
a
22
0
aa
1
1
bb
2
2
cc
3
3.2.4.3 以列名读取数据
已列名读取数据时,[ ]
读取的是series格式,[[ ]]
读取的DataFrame格式
data[ "a" ]
0 aa
1 bb
2 cc
Name: a, dtype: object
data[ [ "a" ] ]
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 取行
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
用iloc
和loc
取出的都是series类
取某几行,用切片
data. iloc[ 0 : 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 ]
data[ - data[ 22 ] == True ]
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
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 ()
方法合并
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
如果是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)
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
results = pd. DataFrame