pandas的简单使用

pandas的简单使用

  • 创建DataFrame
  • 解决pycharm显示不全
  • 文件读写
    • CSV, TXT
    • Excel
    • MySQL
    • 读网页中的表格
  • 查看属性
  • 统计
    • 描述性统计(针对数值型)
  • 重复
    • 查重
    • 唯一值和重复值
    • 去重
  • 排序
  • 对比
  • pandas的简单使用(增,删,改,查)

pandas用户指南:https://pandas.pydata.org/pandas-docs/stable/user_guide/index.html

创建DataFrame

字典形式

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
'''

解决pycharm显示不全

可任意设置显示的函数和列数

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文件速度会快很多(数据量越多,差距越明显)。

在读取文件时,以下参数都适用

  • header 设置某一行为列标签,可以是数字。例如: header=None表示不将文件内容当作列名
  • usecols 读取数据集当中的某几列。 例如:usecols=[“Id”, “SalePrice”]
  • index_col 用于设置索引。 例如:index_col=“Date” 是将数据集中的Date列作索引
  • nrows 设置读取文件的行数。 例如:nrows=100表示读取文件的前100行
  • skiprows 跳过指定行。例如: skiprows=[1, 5],跳过第一和第五行; skiprows=100,跳过前100行
  • na_values 将文件中的空值,设置为指定字符。 例如: na_values=[“null”]
  • true_value,false_values 替换布尔值。例如: true_values=[“yes”], false_values=[“no”]

CSV, TXT

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

# 读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

对于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
pandas的简单使用_第1张图片

把表格里的数据爬下来(针对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():找出这一列中的唯一值,数值和非数值均可用,类型是 类似于用set()去重

  • 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)

  • by: 字符串或者List<字符串>,单列排序或者多列排序
  • ascending: bool或者List,升序还是降序,如果是list对应by的多列
  • inplace: 是否修改原始DataFrame

一般来说,排序是用来查看的,所以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的简单使用(修改)

  • pandas的简单使用(查询)

你可能感兴趣的:(#,Pandas,python,数据分析,pandas)