跟我一起学点 数据分析 -- 第二天:上手pandas(2)

在这里插入图片描述

回顾前文

跟我一起学点 数据分析 – 第一天:上手pandas(1)

DataFrame

DataFrame是pandas最重要的类,我们通过分析DataFrame的属性来了解数据,通过使用DataFrame的方法来分析数据。

DataFrame关键属性案例演示

csv文件依旧使用上一篇的test.csv。

columns属性

import pandas as pd

csv_file = 'test.csv'

df = pd.read_csv(csv_file)

print(df.columns)
print(type(df.columns))

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
Index(['a', 'b'], dtype='object')
<class 'pandas.core.indexes.base.Index'>	# pandas的一个关键属性

  
 
  • 1
  • 2

换上values:print(df.columns.values)
结果:['a' 'b']

是所有列的名称。

现在要找出所有包含‘a’的列:

for name in df.columns.values: if name.find('a')>=0: print(name)

  
 
  • 1
  • 2
  • 3

这是一个办法。那有没有简洁一点的办法,就像lambda函数那样的,也是有办法的。

list(filter(lambda x:x.find('a')>=0,df.columns.values))
# filter生成器参数:第一个为函数指针,第二个为一个数组,作为函数指针的参数传入。
# 由于filter的返回值是一个元组,所以用列表强转一下


  
 
  • 1
  • 2
  • 3
  • 4

index属性

print(df.index)
print(type(df.index))

  
 
  • 1
  • 2
RangeIndex(start=0, stop=3, step=1)
<class 'pandas.core.indexes.range.RangeIndex'>

  
 
  • 1
  • 2

从0开始,到3结束,步长为1。


values属性

print(df.values)
print(type(df.values))

  
 
  • 1
  • 2
[[ 1.  2.]
 [ 3.  4.]
 [nan  5.]]
<class 'numpy.ndarray'>

  
 
  • 1
  • 2
  • 3
  • 4

可以看出,是一个多维数组。

dtypes属性

print(df.dtypes['a'])
print(type(df.dtypes))

  
 
  • 1
  • 2
float64
<class 'pandas.core.series.Series'>

  
 
  • 1
  • 2

这个我就不多说了吧,上一篇都有讲过了。


size 和 shape 属性

这俩直接看吧,

print(df.size)
print(df.shape)


  
 
  • 1
  • 2
  • 3
6	# 有多少个元素
(3, 2) # 几行几列

  
 
  • 1
  • 2

pandas的数据类型

多说无益,直接看:

基础数据类型:
离散型:objec(字符串),bool,timedelta
连续型:int,float,datatime

数据类型转换:
astype方法
to_numeric方法
to_datatime方法

上一篇讲过的这里不再赘述。

converters参数转换数据类型

前边讲过可以在读取的时候指定dtype参数对指定列的数据类型进行修改,但是那个太笼统了,有时候你就改不了,像我昨天遇到一个NAN,还不让我强转为int类型。

def toint(x): try: return int(float(x))	# 你也不知道传进来的是什么数据类型,还是先转为float再说 except: return 0 df = pd.read_csv(csv_file,converters={'a':toint})

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

解析时间数据类型

为了操作方便,我给csv文件加上了一列时间:

a,b,data
1,2,2018-10-1
3,4,2020-12-12
,5

  
 
  • 1
  • 2
  • 3
  • 4
df = pd.read_csv(csv_file,parse_dates=['data'])
print(df.dtypes['data'])
print(df.head())

  
 
  • 1
  • 2
  • 3
datetime64[ns] a  b data
0  1.0  2 2018-10-01
1  3.0  4 2020-12-12
2  NaN  5 NaT

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

pandas数据持久化

保存数据到csv

to_csv()是DataFrame类的方法,常用参数释义如下:

path_or_buf:文件保存位置
sep:分隔符,如果不写,默认是‘,’
columns:指定保存的列
header:是否保存列名称
index:是否保存索引列
index_label:索引列名称

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

实验

保存到csv

df = pd.read_csv(csv_file,parse_dates=['data'])

df.to_csv('test2.csv',sep='\t')

  
 
  • 1
  • 2
  • 3
	a	b	data
0	1.0	2	2020-10-21
1	3.0	4	2020-10-21
2		5	


  
 
  • 1
  • 2
  • 3
  • 4
  • 5

指定列保存且不保存索引列

df = pd.read_csv(csv_file,parse_dates=['data'])

df.to_csv('test3.csv',columns='a',index = False)

  
 
  • 1
  • 2
  • 3
a
1.0
3.0
""

  
 
  • 1
  • 2
  • 3
  • 4

指定索引列

df = pd.read_csv(csv_file,parse_dates=['data'])

df.to_csv('test4.csv',index_label='ID')
# 感觉更像是给索引列起个名字

  
 
  • 1
  • 2
  • 3
  • 4
ID,a,b,data
0,1.0,2,2020-10-21
1,3.0,4,2020-10-21
2,,5,

  
 
  • 1
  • 2
  • 3
  • 4

保存数据到json

在这里插入图片描述

示例

在这里插入图片描述
在这里插入图片描述

没拿到资料,所以暂时没有例子。
等我过两天做数据分析之后就有了。


保存数据到Excel

DataFrame.to_excel(excel_writer, sheet_name='Sheet1', columns=None, header=True, index=True)

  
 
  • 1

参数释义:
好像也没啥好释义的了,前边都讲过了。

直接演示吧。

df = pd.read_csv(csv_file,parse_dates=['data'])

df.to_excel('text1.xlsx',sheet_name='a')

  
 
  • 1
  • 2
  • 3

在这里插入图片描述
这个日期写入出了问题。。

怎么办?凉拌
转object写入,动手试试,亲测可用、

此外还要注意,在写入的时候,相应的Excel应在电脑上没有被人为打开、


往多个表中写入数据

这里需要使用到ExcelWriter

df = pd.read_csv(csv_file,parse_dates=['data'])

with pd.ExcelWriter('test4.xlsx') as f: df.to_excel(f,sheet_name='a',columns=['a'],index=True,index_label='ID') df.to_excel(f, sheet_name='b', columns=['b','data'], index=True, index_label='ID')

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

请自行查看结果。


保存数据到MySQL

def to_sql( self, name, con, schema=None, if_exists="fail", index=True, index_label=None, chunksize=None, dtype=None, method=None, )

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

参数释义:(释义过的参数不再赘述)

schema:用于创建数据库对象,基本上都是使用默认值。

if_exists:如果表存在怎么办?

fail:抛出ValueError异常
replace:在插入数据之前删除表。注意不是仅删除数据,是删除原来的表,重新建表哦。
append:插入新数据。如果有主键,要避免主键冲突;看清表的格式,DataFrame的columns与表的columns是对应的;DF的index默认是作为一列数据的,也就是说默认会写入数据库的

  
 
  • 1
  • 2
  • 3

index:将索引作为一列写入数据库,默认为True,也就是说默认DF的索引是要写入数据库的,index_label为列名

index_label:将索引写入数据库时的列名,默认为index;如果DF是多级索引,则index_label应为一个序列

chunksize:批处理,每次处理多少条数据。默认全部,一般没啥用,除非数据量太大,明显感觉卡的时候可以分批处理。

dtype:一个字典,指定列的数据类型。键是列的名字,值是sqlalchemy types或者sqlite3的字符串形式。如果是新建表,则需要指定类型,不然会以存储量最大类型作为默认类型。比如varchar类型就会成为text类型,空间资源浪费很多。如果是添加数据,则一般不需要规定该参数。

method:哪种类型的插入语句?

None:默认单行插入
‘multi’:多行插入
callable:以回调函数插入,写函数的名字,没用过。

  
 
  • 1
  • 2
  • 3

在这里我想说:如果你不是很急着存取数据库,且数据量又大,不妨直接写到csv里面,后期直接从csv中导入数据到数据库。

使用apply处理每一行数据

DataFrame.apply(func,axis)

  
 
  • 1

常用参数释义:
func:函数指针,用于内部处理的函数
axis:给函数指针传的参数,

1:按行处理数据
0:按列处理数据

  
 
  • 1
  • 2

演示

给a列数据乘方吧。

df = pd.read_csv(csv_file,dtype = {'data':object})
print(df.head())

df['aa'] = df.apply(lambda x: x.a*x.a,axis = 1) #你可以试试按列处理

print(df.head())

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
   ID a  b data
0   0  1.0  2  2020-10-21
1   1  3.0  4  2020-10-21
2   2  NaN  5 NaN ID a  b data   aa
0   0  1.0  2  2020-10-21  1.0
1   1  3.0  4  2020-10-21  9.0
2   2  NaN  5 NaN  NaN

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

常用的就按行处理。


暂且到这儿,下一篇进入一个小小的实战总结。

在这里插入图片描述

文章来源: lion-wu.blog.csdn.net,作者:看,未来,版权归原作者所有,如需转载,请联系作者。

原文链接:lion-wu.blog.csdn.net/article/details/111767816

(完)