pandas用户指南:https://pandas.pydata.org/pandas-docs/stable/user_guide/index.html
字典形式
import pandas as pd
# values里面的列表的长度必须一致
rowdata={
'电影名称':['无问西东','后来的我们','前任3','红海行动','唐人街探案','战狼2'],
'打斗镜头':[1,5,12,108,112,115],
'接吻镜头':[101,89,97,5,9,8],
'电影类型':['爱情片','爱情片','爱情片','动作片','动作片','动作片']
}
df = pd.DataFrame(rowdata)
print(df)
'''
电影名称 打斗镜头 接吻镜头 电影类型
0 无问西东 1 101 爱情片
1 后来的我们 5 89 爱情片
2 前任3 12 97 爱情片
3 红海行动 108 5 动作片
4 唐人街探案 112 9 动作片
5 战狼2 115 8 动作片
'''
numpy形式
import numpy as np
import pandas as pd
df = pd.DataFrame(np.arange(12).reshape(3,4),columns=['a','b','c','d'])
print(np.arange(12).reshape(3,4))
print('-'*50)
print(df)
'''
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
--------------------------------------------------
a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
'''
可任意设置显示的函数和列数
import pandas as pd
pd.set_option('display.max_rows', 80)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
这个不太推荐,因为当列数超过屏幕宽度时,它会换行显示。
import pandas as pd
pd.options.display.max_columns = None
pd.options.display.max_rows = None
在做数据分析时,文件大都会使用csv。两个内容相同的csv和excel文件,使用pandas读csv文件速度会快很多(数据量越多,差距越明显)。
在读取文件时,以下参数都适用
import pandas as pd
# 读文件,header=None意思是将第一行信息包含在DataFrame值内。如果不加,第一行数据就会变成列名
xiao5g = pd.read_table('F:\校园.txt',header=None,sep=';')
xiao4g = pd.read_csv('F:\校园.csv',header=None)
# 写csv文件,index=False意思是,写入文件时不把索引作为单独的一列。如果为True,索引会单独成一列
xiao5g.to_csv(r"F:\Temp\img\xiao5g.csv",index=False) # 绝对路径
xiao4g.to_csv(r"../../Data/School/xiao4g.csv",index=False) # 相对路径
挑几个常用参数,做个示范
import pandas as pd
# 因为分隔符是两个冒号,为了避免识别有误,所以添加了 engine='python'
# nrows表示读几行,默认是读取全部(一般不用)
# index_col表示设置索引。它可以等于数字,则对应列就变成索引(一般不用)
xiao5g = pd.read_table('F:\校园小区场景.txt',header=None,sep='::',nrows=10,engine='python',names=['省','市','区/县'],index_col=["a", "b", "c", "d", "e"],dtype=str)
# 读Excel文件
pd.read_excel(io, sheet_name=0, header=0, skiprows=None, skip_footer=0, index_col=None, names=None, parse_cols=None, parse_dates=False, date_parser=None, na_values=None, convert_float=True, has_index_names=None, converters=None, dtype=None, engine=None, **kwds)
'''
该函数主要的参数为io、sheet_name、header、names、encoding。
io:excel文件,可以是文件路径、文件网址、file-like对象、xlrd workbook;
sheet_name:返回指定的sheet,参数可以是字符串(sheet名)、整型(sheet索引)、list(元素为字符串和整型,返回字典{'key':'sheet'})、none(返回字典,全部sheet);
header:指定数据表的表头,参数可以是int、list of ints,即为索引行数为表头;
names:返回指定name的列,参数为array-like对象。
encoding:关键字参数,指定以何种编码读取。
skiprows:跳过前几行。例如skiprows=2,是跳过excel的前两行,从第三行开始读数据。
该函数返回pandas中的DataFrame或dict of DataFrame对象,利用DataFrame的相关操作即可读取相应的数据。
usecols:读入指定的列,可以是整数,也可以是字符串 usecols=['学号','姓名','分数']或usecols=[0,1,3]
'''
import pandas as pd
excel_path = 'F:\\data\\duo.xlsx'
# df是dict类型 运行print(data.keys())可以查看当前excel表里的所有工作表名
df = pd.read_excel(excel_path, sheet_name=None)
df1 = df['Sheet1']
df2 = df['Sheet2']
# 或者直接读工作表
df3 = pd.read_excel(excel_path, sheet_name='Sheet1')
# 写Excel文件
DataFrame.to_excel(excel_writer, sheet_name='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)
'''
该函数主要参数为:excel_writer。
excel_writer:写入的目标excel文件,可以是文件路径、ExcelWriter对象;
sheet_name:被写入的sheet名称,string类型,默认为'sheet1';
na_rep:缺失值表示,string类型;
header:是否写表头信息,布尔或list of string类型,默认为True;
index:是否写行号,布尔类型,默认为True;
encoding:指定写入编码,string类型。
'''
import pandas as pd
# writer=pd.ExcelWriter(r'../../Data/School/output.xlsx') # 相对位置
writer=pd.ExcelWriter(r'F:\output.xlsx') # 绝对位置
xiao4g.to_excel(writer,sheet_name='Sheet1', index=False)
xiao5g.to_excel(writer,sheet_name='Sheet2', index=False)
writer.save()
对于mysql写的情况不常见。to_sql官网文档https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html
import pymysql
import pandas as pd
conn = pymysql.connect(
host='127.0.0.1',
user='root',
password='123456',
database='text',
charset='utf8'
)
df = pd.read_sql('select * from stu', con=conn)
print(df)
pandas的神操作,省了写爬虫
随意找了一个网页:https://www.espn.com/nfl/team/depth/_/name/buf
把表格里的数据爬下来(针对table标签,如果没有找到,会报错)
import pandas as pd
url = 'https://www.espn.com/nfl/team/depth/_/name/buf'
data = pd.DataFrame()
data = data.append(pd.read_html(url), ignore_index=True)
print(data)
writer=pd.ExcelWriter(r'F:\output.xlsx')
data.to_excel(writer,sheet_name='Sheet1',index=False)
writer.save()
# 对比两个DataFrame之间的异同,返回bool值
bl = df1.equals(df2)
# 行列数
num = df.shape
# 行数乘以列数
s = df.size
# 统计个数(一般搭配列使用)
# 不加列df.value_counts(), 多个列df[['列1','列2']].value_counts()
count = df['weight'].value_counts()
# 索引
ind = df.index
# 列名
col_name = df.columns
# 查看值,二维列表形式,第一行就是list[0],第二行是list[1]...
val = df.values
# 每一列的数据类型
types = df.dtypes
# 查看每一列的非空值个数,和数据类型。dtypes的升级版
info = data.info()
# 返回一个相同行列数的DataFrame,若对应位置有值,则显示False,若对应位置是空值,则显示True
isn = df.isnull()
isn = pd.isnull(df)
# 与isnull()类似,但刚好相反。返回一个相同行列数的DataFrame,若对应位置有值,则显示True,若对应位置是空值,则显示False
notn = df.notnull()
notn = pd.notnull(df)
pandas的简单使用(数据统计):https://blog.csdn.net/qq_55342245/article/details/121521893
df.describe():查看数据值列的汇总统计
df.count():返回每一列中的非空值的个数
df.value_counts():返回值出现的次数
df.max():返回每一列的最大值
df.idxmax():返回每一列的最大值对应的索引
df.min():返回每一列的最小值
df.idxmin():返回每一列的最小值对应的索引
df.mean():返回每一列的均值
df.median():返回每一列的中位数
df.std():返回每一列的标准差
df.var():返回每一列的方差
df.cov():协方差矩阵(输出列之间 练两对应的协方差)
df.corr():相关系数矩阵(输出列之间 两两对应的相关系数)
df.unique():找出这一列中的唯一值,数值和非数值均可用,类型是
df.value_counts():返回值出现的次数
描述性统计只针对列数据是int型的。它能看出这一列中数据的分布情况
# 统计个数,计算均值,方差,最小值,一二三分位数,最大值(count mean std min 25% 50% 75% max)
a = data.describe()
# 加参数形式(参数过多,加个转置方便看)
aa = data.describe([0.01,0.1,0.25,0.5,0.75,0.9,0.99]).T
# 检测重复行 哪行重复就返回True。输出一列索引,一列bool值
bl = data.duplicated()
# 检测重复行数(True是1,False是0)
repeat_row_num = data.duplicated().sum()
只针对某一列检测重复
# 针对dip这列,检测重复行,哪行重复就返回True。输出一列索引,一列bool值
bl = data.duplicated('dip')
# 针对dip这列,检测重复行数(True是1,False是0)
repeat_row_num = data.duplicated('dip').sum()
# 找出dip里的唯一值
wei = df['dip'].unique()
wei = set(df['dip'].tolist())
wei = df[df.duplicated('dip') == False]['dip'].tolist()
# 找出dip里的重复值
chongfu = df.loc[df.duplicated('dip')==True,:]['dip'].tolist()
# 或者
df_count = df['dip'].value_counts()
df_count = pd.DataFrame({'值':df_count.index,'次数':df_count.values})
chongfu = df_count[df_count['次数']>1]['值'].tolist()
# a比b多两列字段(值,次数),但内容一致,只是顺序略有不同。
# a会有聚类的效果,且索引变为从0开始的顺序数字
# b只是将包含的值按原顺序输出,索引对应原df的索引
a = pd.merge(df, df_count[df_count['次数']>1], left_on='dip', right_on='值', how='inner')
b = df[df['dip'].isin(df_count[df_count['次数']>1]['值'].values)]
inplace=True是删除原内容,在当前DataFrame上修改。inplace=False不改变内容
data.drop_duplicates(inplace=True) 与 data = data.drop_duplicates() 运行 print(data) 结果一样
# 删除重复行 等效于 data = data.drop_duplicates()
data.drop_duplicates(inplace=True)
# 针对dip这列,删除重复行 等效于 data = data[data.duplicated('dip') == False]
data.drop_duplicates('dip',inplace=True)
DataFrame.sort_values(by, ascending=True, inplace=False)
一般来说,排序是用来查看的,所以inplace参数用的较少。而axis参数基本不怎么用
下面两行代码都是对分数进行降序排序,
第一行改变了df的内容。而第二行不改变df,只是将df修改后的结果赋值给了一个新变量data。
df.sort_values(by="分数",axis=0,ascending=False,inplace=True)
data = df.sort_values(by='分数', ascending=False)
# 对分数进行降序(从高到低)排序 显示全部信息
data = df.sort_values(by='分数', ascending=False)
# 对分数进行降序(从高到低)排序 只显示一列索引和一列分数
data = df['分数'].sort_values(ascending=False)
# 两个字段都是降序(先对身高进行降序排序,当身高相同时,对体重进行降序排序)
data = df.sort_values(by=['身高','体重'], ascending=False)
# 分别指定 升序,降序
data = df.sort_values(by=['身高','体重'], ascending=[True,False])
对比两个数据表内容是否一致
import pandas as pd
pd.set_option('display.max_rows', 80)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
df = pd.read_csv('./data/dw_score.csv')
# df.columns = ['userid',name','score']
df = df.sort_values(by='userid', ascending=False)
df.fillna(0, inplace=True)
df.reset_index(inplace=True,drop=True)
print(df)
print('----------------------------------------')
data = pd.read_csv('./data/dw_score_1.csv')
# data.columns = ['userid',name','score']
data = data.sort_values(by='userid', ascending=False)
data.fillna(0, inplace=True)
data.reset_index(inplace=True,drop=True)
print(data)
print('----------------------------------------')
print()
print('===============================================')
print('=== 对比内容是否相同:')
print(df.equals(data))
print('=== 每列相同的个数:')
print((df==data).sum())
print('=== 数据对比矩阵:(相同为True,不同为False)')
print(df==data)
pandas的简单使用(增加)
pandas的简单使用(删除)
pandas的简单使用(修改)
pandas的简单使用(查询)