Pandas

数据分析工具Pandas

Pandas的数据结构分析

# Series 一维数据结构
# DataFrame 二维数据结构

Series

# Series 类的构造方法
# class pandas.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)
# date:传入的数据
# index: 索引
# dtype:数据类型
# copy: 是否复制数据,默认False
import pandas as pd
ser_obj = pd.Series([1,2,3,4])
print(ser_obj)
0    1
1    2
2    3
3    4
dtype: int64
# 用列表构建Pandas对象,并指定索引
ser_obj = pd.Series([1,2,3,4],index=['a','b','c','d'])
print(ser_obj)
a    1
b    2
c    3
d    4
dtype: int64
# 可以用dict字典构建pandas对象
year_data = {2002:11,2023:1,2005:17}
year_obj = pd.Series(year_data)
year_obj
2002    11
2023     1
2005    17
dtype: int64
# index属性,返回索引值对象
year_obj.index
# type(year_obj.index)   #pandas.core.indexes.numeric.Int64Index
Int64Index([2002, 2023, 2005], dtype='int64')
# value属性,返回值数组
year_obj.values
# type(year_obj.values)   # numpy.ndarray
array([11,  1, 17], dtype=int64)
# 用索引来获取数据
year_obj[2002]
11
# 数组运算后,索引和数据的对应关系仍然保持

DataFrame

# DataFrame 是一个类似于二维数组或表格的对象,每列可以是不同的数据类型
# 由索引和数据组成,索引包含行索引和列索引
# Pandas的DataFrame类的对象构造方法
# pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
# index:行标签
# columns:列标签
demo_arr = np.array([[1,2,3,4],['a','b','c','d']])
demo_arr_obj = pd.DataFrame(demo_arr)
demo_arr_obj
0123
01234
1abcd
demo_arr_obj[2]
0    3
1    c
Name: 2, dtype: object
demo_arr_obj.2
  File "C:\Users\lenovo\AppData\Local\Temp\ipykernel_8256\527398533.py", line 1
    demo_arr_obj.2
                ^
SyntaxError: invalid syntax
# 为DataFrame增加一列数据
demo_arr_obj['No4']=[2,'k']
demo_arr_obj
0123No4
012342
1abcdk
element = demo_arr_obj['No4'][0]
print(type(element))
<class 'int'>
# 为DataFrame删除一列数据
del demo_arr_obj[0]
demo_arr_obj
13No4
0242
1bdk

Pandas索引操作及高级索引

索引对象

# Index索引对象不可变,已保障数据安全
# Pandas 其他常见的Index子类
# ① Int64Index:针对整数的特殊Index对象
# ② MultiIndex:层次化索引,表示单个轴上的多层索引
# ③DetimeIndex:储存纳秒时间戳

重置索引

# reindex() 方法:匹配原索引和新索引,填充未匹配的新索引对应值,并将原索引按新索引进行排序
# 格式为:DataFrame.reindex(labels=None, index=None, columns=None, axis=None, method=None, copy=True, level=None, fill_value=nan, limit=None, tolerance=None)
# 参数解释:① index:新索引序列
# ② method:插值填充方式
# ③ fill_value:引入缺失值时使用的替代值
# ④ limit:向前或向后填充是的最大填充量
import pandas as pd
ser_obj = pd.Series([1,2,3,4,5], index=['c','d','a','b','e'])
ser_obj
c    1
d    2
a    3
b    4
e    5
dtype: int64
# reindex()重置索引
ser_obj2 = ser_obj.reindex(['a','b','c','d','e','f'])
ser_obj2
a    3.0
b    4.0
c    1.0
d    2.0
e    5.0
f    NaN
dtype: float64
# 重置索引时指定填充缺失值
ser_obj2 = ser_obj.reindex(['a','b','c','d','e','f'], fill_value=0)
ser_obj2
a    3
b    4
c    1
d    2
e    5
f    0
dtype: int64
# 重置索引,向前填充值
ser_obj3 = ser_obj2.reindex(['a','b','c','d','e','f','g'], method='ffill')
ser_obj3
a    3
b    4
c    1
d    2
e    5
f    0
g    0
dtype: int64
ser_obj2
a    3
b    4
c    1
d    2
e    5
f    0
dtype: int64

索引操作

Series 的索引操作
# 可以使用索引,索引名称,或切片来查询数据
import pandas as pd
arr1 = np.arange(1,6,1)
ser_obj = pd.Series(arr1, index=['a','b','c','d','e'])
ser_obj
a    1
b    2
c    3
d    4
e    5
dtype: int32
# 使用索引查询
ser_obj[2]
3
# 使用索引名称查询
ser_obj['e']
5
# 使用切片查询
ser_obj[2:4]
c    3
d    4
dtype: int32
# 查询不连续的数据
ser_obj[[0,2,4]]
a    1
c    3
e    5
dtype: int32
# 使用布尔索引
ser_bool = ser_obj>2
ser_bool
a    False
b    False
c     True
d     True
e     True
dtype: bool
ser_obj[ser_bool]
c    3
d    4
e    5
dtype: int32
DataFrame的索引操作
# DataFrame既有行索引,通过index属性进行获取,又有列索引,通过columns属性进行获取
# DataFrame中每一列都是一个Series对象
# 创建一个3*4的DataFrame对象
arr = np.arange(12).reshape((3,4))
df_obj = pd.DataFrame(arr,columns=['a','b','c','d'])
df_obj
abcd
00123
14567
2891011
# 通过列索引名
df_obj['c']
0     2
1     6
2    10
Name: c, dtype: int32
# 通过列索引名获取不连续数据(Serise对象)
df_obj[['c','a']]
ca
020
164
2108
# 通过切片获取数据
df_obj[0:1]
abcd
00123
df_obj[:3][['a','c']]
ac
002
146
2810

使用Pandas提供的方法操作索引

# loc():基于标签索引,按标签取数,当执行切片操作时,既包含起始索引也包含结束索引
# loci():基于位置索引(整数索引),按位置取数,当执行切片操作时,只包含起始索引,不包含结束索引
df_obj.loc[1:2,['b','c']]
df_obj.iloc[1:2,1:2]
df_obj.iloc[1:2,[1,2]]
bc
156

算术运算与数据对齐

# Pandas执行算术运算时,会先按照索引进行对齐在进行运算,没有对齐的位置会用NaN补齐
# Serise是按照行索引补齐的,DataFrame是按照行索引、列索引对齐的
obj1 = pd.Series(range(1,4), index=range(3))
obj1
0    1
1    2
2    3
dtype: int64
obj2 = pd.Series(range(10,16), index=range(6))
obj2
0    10
1    11
2    12
3    13
4    14
5    15
dtype: int64
obj1 + obj2
0    11.0
1    13.0
2    15.0
3     NaN
4     NaN
5     NaN
dtype: float64
obj1.add(obj2,fill_value=0)
0    11.0
1    13.0
2    15.0
3    13.0
4    14.0
5    15.0
dtype: float64

数据排序

按索引排序

# sort_index()方法:可以用行索引或者列索引进行排序
# 格式sort_index(axis=0,level=None,ascending=true,inplace=False,kind='quicksort',na_position='last',sort_remaining=True,by=None)
# axis:轴索引
# level:若不为None,则对指定索引级别的值进行排序
# ascending:是否升序排列,默认True
# inplace:默认为False,标识对数据表进行排序,不创建新的实例
# kind:选择排序算法
ser_obj2 = pd.Series(range(7,20,3),index=range(5))
ser_obj2
0     7
1    10
2    13
3    16
4    19
dtype: int64
ser_obj2.sort_index(ascending=False)
4    19
3    16
2    13
1    10
0     7
dtype: int64
ser_obj2[5]=7
ser_obj2
0     7
1    10
2    13
3    16
4    19
5     7
dtype: int64

按值排序

# sortvalues(by,axis=0,ascending=True,inplace=False,king='quicksort',na_position='last')
# by:表示排序的列
# na_position 的参数只有两个值,first表示 NaN会放在开头,last表示NaN放在末尾,默认放在末尾
ser_obj2.sort_values()
0     7
5     7
1    10
2    13
3    16
4    19
dtype: int64
ser_obj2
0     7
1    10
2    13
3    16
4    19
5     7
dtype: int64
ser_obj2.sort_values(inplace=True)
ser_obj2
0     7
5     7
1    10
2    13
3    16
4    19
dtype: int64
data = np.arange(1,13,1).reshape(3,4)
df_obj2 = pd.DataFrame(data)
df_obj2
0123
01234
15678
29101112
df_obj2.sort_values(by=2,ascending=False)
0123
29101112
15678
01234

统计计算与描述

常用的统计计算

# sum:计算和
# mean:均值
# median:中位数
# max,min:最大值,最小值
# idxmax,idxmin:最大索引,最小索引
# count 计算非NaN个数
# var:方差
# head:获取前N个值
# std:样本值的标准差
# skew:样本值的偏度(三阶矩)
# kurt:样本值的峰度(四阶矩)
# cumsum:样本值的累计和
# cummin,cummax:yapf_reformat本值的累积最小值和累积最大值
# cumprod:样本的累计积
# describe:对Series和DataFrame列计算汇总统计
# 求每列的和
df_obj2.sum()
0    15
1    18
2    21
3    24
dtype: int64
# 求每行的和
df_obj2.sum(axis=1)
0    10
1    26
2    42
dtype: int64
df_obj2.head(1)
0123
01234

统计描述

df_obj2.describe().loc[['std'],0:3]
0123
std4.04.04.04.0

层次化索引

认识层次化索引

①在构造方法的index参数中上传一个嵌套列表

# 创建两层索引结构的Series对象
multiindex_ser_obj = pd.Series(range(145875,746431,80456),index=[['a','a','a','a','b','b','b','b'],['aa','ab','ac','ad','ba','bb','bc','bd']])
multiindex_ser_obj
a  aa    145875
   ab    226331
   ac    306787
   ad    387243
b  ba    467699
   bb    548155
   bc    628611
   bd    709067
dtype: int64
# 创建两层索引结构的DataFrame对象
multiindex_df_obj = pd.DataFrame(range(145875,746431,80456),index=[['a','a','a','a','b','b','b','b'],['aa','ab','ac','ad','ba','bb','bc','bd']],columns=['占地面积'])
multiindex_df_obj
占地面积
aaa145875
ab226331
ac306787
ad387243
bba467699
bb548155
bc628611
bd709067

②通过MultiIndex类的方法构建一个层次化索引

# MultiIndex.from_tuples():将元组列表转换为MultiIndex
# MultiIndex.from_arrays():将数组列表转换为MultiIndex
# MultiIndex.from_product():从多个集合的笛卡尔积中创建一个MultiIndex
# MultiIndex.from_tuples():将元组列表转换为MultiIndex
from pandas import MultiIndex

list_tuples = [('A','A1'),('A','A2'),('A','A3'),('A','A4'),('A','A5'),('B','B1'),('B','B2'),('B','B3')]
multiIndex = MultiIndex.from_tuples(tuples=list_tuples,names=['外层索引','内层索引'])
data = np.arange(1,41,1).reshape(8,5)
df_obj3 = pd.DataFrame(data,index=multiIndex)
df_obj3

01234
外层索引内层索引
AA112345
A2678910
A31112131415
A41617181920
A52122232425
BB12627282930
B23132333435
B33637383940
# MultiIndex.from_arrays():将数组列表转换为MultiIndex
MIDX = np.array([['A','B','A','B','A','A','B','B'],['A1','B2','A2','B1','A4','A3','B3','B3']])
MIDX_obj = MultiIndex.from_arrays(arrays=MIDX,names=['外层索引','内层索引'])
df_obj4 = pd.DataFrame(data,index=MIDX_obj)
df_obj4
01234
外层索引内层索引
AA112345
BB2678910
AA21112131415
BB11617181920
AA42122232425
A32627282930
BB33132333435
B33637383940
# MultiIndex.from_product():从多个集合的笛卡尔积中创建一个MultiIndex
nums = [0,1,2,3]
colors = ['r','g']
MPROD = multiIndex.from_product(iterables=[nums,colors],names=['nums','colors'])
df_obj5 = pd.DataFrame(data,index=MPROD)
df_obj5
01234
numscolors
0r12345
g678910
1r1112131415
g1617181920
2r2122232425
g2627282930
3r3132333435
g3637383940

层次化索引的操作

①选取子集操作

maidx = np.array([['小说','小说','小说','随笔散文','随笔散文','随笔散文','传记','传记','传记'],['高山上的小邮局','失踪的总统','绿毛水怪','皮囊','浮生六记','自在独行','梅西','老舍自传','库里传']])
maidx_obj = MultiIndex.from_arrays(maidx,names=['书籍类别','书籍名称'])
nums = np.array([50,60,40,94,63,101,200,56,45])
book_obj = pd.Series(nums,index=maidx_obj)
book_obj
书籍类别  书籍名称   
小说    高山上的小邮局     50
      失踪的总统       60
      绿毛水怪        40
随笔散文  皮囊          94
      浮生六记        63
      自在独行       101
传记    梅西         200
      老舍自传        56
      库里传         45
dtype: int32
book_obj.loc[['传记'],:]
书籍类别  书籍名称
传记    梅西      200
      老舍自传     56
      库里传      45
dtype: int32
book_obj[:,'自在独行']
书籍类别
随笔散文    101
dtype: int32

② 交换分层索引

# 交换内外层索引
# swaplevel()
book_obj.swaplevel()
书籍名称     书籍类别
高山上的小邮局  小说       50
失踪的总统    小说       60
绿毛水怪     小说       40
皮囊       随笔散文     94
浮生六记     随笔散文     63
自在独行     随笔散文    101
梅西       传记      200
老舍自传     传记       56
库里传      传记       45
dtype: int32

③排序分层

# sort_index()
# sort_index(axis=0,level=None,ascending=true,inplace=False,kind='quicksort',na_position='last',sort_remaining=True,by=None)
# 未传入by参数时,会首先选择按照外层索引进行排序,在按照内层索引进行排序

读写数据操作

读写文本文件

① 通过to_csv()方法将数据写入到CSV文件

# 格式
# to_csv(path_or_buf=None,sep='',na_rep='',float_format=None,columns=None,header=True,index=None,index_label=None,mode='w',encoding=None,compression=None,quoting=None,quotechar='',...)
# 常用参数:path_or_buf:文件路径
# index,
# sep:分隔符,默认为‘.’
# 将DataFrame写入到csv文件中
df = pd.DataFrame({'one':[1,2,3],'two':[4,5,6]})
df.to_csv(r'D:\python数据分析资料\csv文件读写.csv')
'写入完毕'
'写入完毕'

② 通过pd.read_csv()函数读取CSV文件的数据

# read_csv(filepath_or_buffer,sep='',delimiter=None,header='infer',names=None,index_col-None,usecols=None,squeeze=False,prefix=None,...)
# filepath_or_buffer:文件路径
# sep:分隔符,默认','
# names:用于结果的列名,如果读取的文件中没有列名,则默认为0,如果有,设置为None
# index_col:用作行索引的列编号或列名,如果给定一个序列,则表示有多个行索引
file=open(r'D:\python数据分析资料\csv文件读写.csv')
file_data = pd.read_csv(file)
file_data
Unnamed: 0onetwo
0014
1125
2236

③ read_table()函数

# read_table()与read_csv()的区别在于使用的分隔符不同,前者为‘\t’,后者为‘,’

读写excle文件

① 使用to_excle()方法写入excle文件

# 语法格式:
# to_excle(excle_writer,sheet_ame='Sheet1',na_rep='',float_format=None,columns=None,header=True,index=True,index_label=None,startrow=0,startcol=0,engine=None,merge_cells=True,encoding=None,inf_rep='inf',verbose=True,freeze_panes=None)
# excle_writer:文件读取路径
# sheet_name:工作表名称
# na_rep:表示缺失数据
# index:表示是否写入行索引,默认True
import numpy as np
import pandas as pd
df1 = pd.DataFrame({'col1':['数','据'],'col2':['分','析']})
df1.to_excel(r'D:\python数据分析资料\数据分析.xlsx','数据分析Pandas')

② 使用read_excel()函数读取Excel文件

# pandas.read_excel(io,sheet_name=0,header=0,names=None,index_col=None,usecols=None,squeeze=False,dtype=None,engine=None,converters=None,true_values=None,False_values=None,skiprows=None,nrows=None,ma_values=None,paarse_dates=False,data_parser=None,thousands=None,omment=None,skipfooter=0,convert_float=True,**kwds)
# io:接受字符串,表示路径对象
# sheet_name:指定要读取的工作表,可接受字符串或int类型,字符串表示工作表名称,int类型表示工作表索引
# header:用于解析列标签。如果传入一个整数列表,则表示这些行为会合并为一个MultiIndex对象
# index_col:用作行索引的列编号或者列名,如果给定一个序列,则表示有多个行索引
data = pd.read_excel(r'D:\python数据分析资料\数据分析.xlsx',engine='xlrd')
data
---------------------------------------------------------------------------

XLRDError                                 Traceback (most recent call last)

~\AppData\Local\Temp\ipykernel_14516\723589026.py in <module>
----> 1 data = pd.read_excel(r'D:\python数据分析资料\数据分析.xlsx',engine='xlrd')
      2 data


D:\anaconda\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs)
    309                     stacklevel=stacklevel,
    310                 )
--> 311             return func(*args, **kwargs)
    312 
    313         return wrapper


D:\anaconda\lib\site-packages\pandas\io\excel\_base.py in read_excel(io, sheet_name, header, names, index_col, usecols, squeeze, dtype, engine, converters, true_values, false_values, skiprows, nrows, na_values, keep_default_na, na_filter, verbose, parse_dates, date_parser, thousands, decimal, comment, skipfooter, convert_float, mangle_dupe_cols, storage_options)
    455     if not isinstance(io, ExcelFile):
    456         should_close = True
--> 457         io = ExcelFile(io, storage_options=storage_options, engine=engine)
    458     elif engine and engine != io.engine:
    459         raise ValueError(


D:\anaconda\lib\site-packages\pandas\io\excel\_base.py in __init__(self, path_or_buffer, engine, storage_options)
   1417         self.storage_options = storage_options
   1418 
-> 1419         self._reader = self._engines[engine](self._io, storage_options=storage_options)
   1420 
   1421     def __fspath__(self):


D:\anaconda\lib\site-packages\pandas\io\excel\_xlrd.py in __init__(self, filepath_or_buffer, storage_options)
     23         err_msg = "Install xlrd >= 1.0.0 for Excel support"
     24         import_optional_dependency("xlrd", extra=err_msg)
---> 25         super().__init__(filepath_or_buffer, storage_options=storage_options)
     26 
     27     @property


D:\anaconda\lib\site-packages\pandas\io\excel\_base.py in __init__(self, filepath_or_buffer, storage_options)
    516             self.handles.handle.seek(0)
    517             try:
--> 518                 self.book = self.load_workbook(self.handles.handle)
    519             except Exception:
    520                 self.close()


D:\anaconda\lib\site-packages\pandas\io\excel\_xlrd.py in load_workbook(self, filepath_or_buffer)
     36         if hasattr(filepath_or_buffer, "read"):
     37             data = filepath_or_buffer.read()
---> 38             return open_workbook(file_contents=data)
     39         else:
     40             return open_workbook(filepath_or_buffer)


D:\anaconda\lib\site-packages\xlrd\__init__.py in open_workbook(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows, ignore_workbook_corruption)
    170         raise XLRDError(FILE_FORMAT_DESCRIPTIONS[file_format]+'; not supported')
    171 
--> 172     bk = open_workbook_xls(
    173         filename=filename,
    174         logfile=logfile,


D:\anaconda\lib\site-packages\xlrd\book.py in open_workbook_xls(filename, logfile, verbosity, use_mmap, file_contents, encoding_override, formatting_info, on_demand, ragged_rows, ignore_workbook_corruption)
     77         t1 = perf_counter()
     78         bk.load_time_stage_1 = t1 - t0
---> 79         biff_version = bk.getbof(XL_WORKBOOK_GLOBALS)
     80         if not biff_version:
     81             raise XLRDError("Can't determine file's BIFF version")


D:\anaconda\lib\site-packages\xlrd\book.py in getbof(self, rqd_stream)
   1282             bof_error('Expected BOF record; met end of file')
   1283         if opcode not in bofcodes:
-> 1284             bof_error('Expected BOF record; found %r' % self.mem[savpos:savpos+8])
   1285         length = self.get2bytes()
   1286         if length == MY_EOF:


D:\anaconda\lib\site-packages\xlrd\book.py in bof_error(msg)
   1276 
   1277         def bof_error(msg):
-> 1278             raise XLRDError('Unsupported format, or corrupt file: ' + msg)
   1279         savpos = self._position
   1280         opcode = self.get2bytes()


XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'c\x14#e\x08\x00\xf8\x01'

读取HTML表格数据

# pandas.read_html(io,match='.+',flavor=None,header=None,index_col=None,skiprows=None,attrs=None,parse_dates=False,tupleize_cols=None,thousands=',',encoding=None,decimal='.',converters=None,na_values=None,keep_default_na=True,displayed_only=True)
# io:表示路径对象
# header:表示指定列标题所在的行
# index_col:表示指定的行标题所在的列
# attrs:用于表示表格的属性值

# 使用read_html()读取网页中的表格数据时,需要注意网页的编码格式
import pandas as pd
import requests
html_data=requests.get('https://www.runoob.com/html/html-tables.html')
html_table_data=pd.read_html(html_data.content,encoding='utf-8')
html_table_data[1]
标签描述
0<table>定义表格
1<th>定义表格的表头
2<tr>定义表格的行
3<td>定义表格单元
4<caption>定义表格标题
5<colgroup>定义表格列的组
6<col>定义用于表格列的属性
7<thead>定义表格的页眉
8<tbody>定义表格的主体
9<tfoot>定义表格的页脚

读写数据库

# 常用函数
# read_sql_table():将读取整张数据表中的数据转换成DataFrame对象
# read_sql_query():将SQL语句读取的结果转换成DataFrame对象
# read_sql():上述两个语句的结合
# to_sql():将数据写入到SQL数据库中

注:连接Mysql数据库时,使用的是mysqlconnector驱动,如果当前环境中没有该模块,需使用pip install mysql-connector 命令安装该模块

① 使用read_sql()函数读取数据

# pandas.read_sql(sql,con,index_col=None,coerce_float=True,params=None,parse_dates=None,columns=None,chunksize=None)
# sql:表示被执行的SQL
# con:接收数据库连接,表示数据库的连接信息
# index_col:如果传入一个列表,则表示层次化索引
# coerce_float:将费字符串,非数字对象的值转换为浮点数类型
# params:传递给执行方法的参数列表,如params={'name':'value'}
# columns:接收list表示读取数据的列名,默认为None
from mysql import connector
---------------------------------------------------------------------------

ModuleNotFoundError                       Traceback (most recent call last)

~\AppData\Local\Temp\ipykernel_14516\3642983536.py in <module>
----> 1 from mysql import connector


ModuleNotFoundError: No module named 'mysql'
pip install mysql-connector
^C
Note: you may need to restart the kernel to use updated packages.
from sqlalchemy import create_engine
from mysql import connector
from mysql import connector
# 读取数据库步骤
# 导入sqlalchemy 模块,通过create_engine()函数创建连接数据库的信息,然后调用read_sql()函数读取数据库中的actor数据表,并转换成DataFrame对象
# create_engine()函数创建链接时,格式如下
# 数据库类型+数据库驱动名称://用户名:密码:@机器地址:端口号/数据库名

import pandas as pd
from sqlalchemy import create_engine
engine = create_engine('mysql+mysqlconnector://root:aa123456'
                       '@127.0.0.1:3306/sakila')
sql = 'SELECT * FROM actor WHERE actor_id<10;'
pd.read_sql(sql,engine)
actor_idfirst_namelast_namelast_update
01PENELOPEGUINESS2006-02-15 04:34:33
12NICKWAHLBERG2006-02-15 04:34:33
23EDCHASE2006-02-15 04:34:33
34JENNIFERDAVIS2006-02-15 04:34:33
45JOHNNYLOLLOBRIGIDA2006-02-15 04:34:33
56BETTENICHOLSON2006-02-15 04:34:33
67GRACEMOSTEL2006-02-15 04:34:33
78MATTHEWJOHANSSON2006-02-15 04:34:33
89JOESWANK2006-02-15 04:34:33

② 使用to_sql()方法将数据写入到数据库中

# 语法格式:
# to_sql(name,con,schema=None,if_exists='fail',index=True,index_label=None,chunksize=None,dtype=None)
# name:数据库表的名称
# con:数据库的连接信息
# if_exists:可以取值为fail,replace,append
    # fail:如果表存在,则不执行写入操作
    # replace:如果表存在,则将源数据库表删除后在重新创建
    # append:如果表存在,name在原数据库表的基础上追加数据
# index:表示是否将DataFrame行索引作为数据传入数据库,默认True
# index_label:表示是否引用索引名称
create database students_info charset=utf-8
  File "C:\Users\lenovo\AppData\Local\Temp\ipykernel_11032\3890836627.py", line 1
    create database students_info charset=utf-8
           ^
SyntaxError: invalid syntax
import pandas as pd
from pandas import DataFrame,Series
from sqlalchemy.types import *
from sqlalchemy import create_engine
from mysql import connector
df = DataFrame({'班级':['一年级','二年级','三年级','四年级'],'男生人数':[25,23,27,30],'女生人数':[19,17,20,20]})
engine = create_engine('mysql+mysqlconnector://root:aa123456'
                       '@127.0.0.1:3306/data_analysis_test')
df.to_sql('students',engine)
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

~\AppData\Local\Temp\ipykernel_20440\1417353508.py in <module>
      7 engine = create_engine('mysql+mysqlconnector://root:aa123456'
      8                        '@127.0.0.1:3306/data_analysis_test')
----> 9 df.to_sql('students',engine)


D:\anaconda\lib\site-packages\pandas\core\generic.py in to_sql(self, name, con, schema, if_exists, index, index_label, chunksize, dtype, method)
   2949         from pandas.io import sql
   2950 
-> 2951         return sql.to_sql(
   2952             self,
   2953             name,


D:\anaconda\lib\site-packages\pandas\io\sql.py in to_sql(frame, name, con, schema, if_exists, index, index_label, chunksize, dtype, method, engine, **engine_kwargs)
    696         )
    697 
--> 698     return pandas_sql.to_sql(
    699         frame,
    700         name,


D:\anaconda\lib\site-packages\pandas\io\sql.py in to_sql(self, frame, name, if_exists, index, index_label, schema, chunksize, dtype, method, engine, **engine_kwargs)
   1730         sql_engine = get_engine(engine)
   1731 
-> 1732         table = self.prep_table(
   1733             frame=frame,
   1734             name=name,


D:\anaconda\lib\site-packages\pandas\io\sql.py in prep_table(self, frame, name, if_exists, index, index_label, schema, dtype)
   1629             dtype=dtype,
   1630         )
-> 1631         table.create()
   1632         return table
   1633 


D:\anaconda\lib\site-packages\pandas\io\sql.py in create(self)
    832         if self.exists():
    833             if self.if_exists == "fail":
--> 834                 raise ValueError(f"Table '{self.name}' already exists.")
    835             elif self.if_exists == "replace":
    836                 self.pd_sql.drop_table(self.name, self.schema)


ValueError: Table 'students' already exists.
# http://gaokao.xdf.cn/201805/10784342.html

案例

import pandas as pd
import requests
html_data = requests.get('https://gaokao.xdf.cn/201805/10784243.html')
html_table_data = pd.read_html(html_data.content,encoding='utf-8')
score = html_table_data[0].loc[:,0:4]
score
01234
0年份一本分数线一本分数线二本分数线二本分数线
1年份文科理科文科理科
22020542537469449
32019542507481432
42018546516476432
52017518481452400
62016518519460438
72015513515462442
82014526534478462
92013507493459440
102012539530492476
112011543570496520
122010533536492491
132009548547507505
142008545546510511
152007580572553439
162006561552528515
score.to_csv('D:\python数据分析资料\score.csv')
'写入完成'
'写入完成'
df_obj = pd.read_csv('D:\python数据分析资料\score.csv',header=[0,1,2])
df_obj
Unnamed: 0_level_001234
0年份一本分数线一本分数线二本分数线二本分数线
1年份文科理科文科理科
022020542537469449
132019542507481432
242018546516476432
352017518481452400
462016518519460438
572015513515462442
682014526534478462
792013507493459440
8102012539530492476
9112011543570496520
10122010533536492491
11132009548547507505
12142008545546510511
13152007580572553439
14162006561552528515
import pandas as pd
from pandas import DataFrame,Series
from sqlalchemy.types import *
from sqlalchemy import create_engine
from mysql import connector
engine = create_engine('mysql+mysqlconnector://root:aa123456'
                       '@127.0.0.1:3306/data_analysis_test')
df_obj.to_sql('score',engine)
'写入完成'
'写入完成'
sorted_obj = pd.read_sql('score',engine)
sorted_obj.max()
index                               None
('Unnamed: 0_level_0', '0', '1')      16
('0', '年份', '年份')                   2020
('1', '一本分数线', '文科')                 580
('2', '一本分数线', '理科')                 572
('3', '二本分数线', '文科')                 553
('4', '二本分数线', '理科')                 520
dtype: object
sorted_obj.describe()
('Unnamed: 0_level_0', '0', '1')('0', '年份', '年份')('1', '一本分数线', '文科')('2', '一本分数线', '理科')('3', '二本分数线', '文科')('4', '二本分数线', '理科')
count15.00000015.00000015.00000015.00000015.00000015.000000
mean9.0000002013.000000537.400000530.333333487.666667463.466667
std4.4721364.47213619.11170225.81988928.05012537.061468
min2.0000002006.000000507.000000481.000000452.000000400.000000
25%5.5000002009.500000522.000000515.500000465.500000438.500000
50%9.0000002013.000000542.000000534.000000481.000000449.000000
75%12.5000002016.500000545.500000546.500000501.500000498.000000
max16.0000002020.000000580.000000572.000000553.000000520.000000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值