python panda是什么_如何最简单、通俗地理解Python的pandas库?
本文总结了pandas作为一个数据分析工具的常用功能。
本文提到的功能,均是我在实际数据分析过程中经常使用到的功能。只要你是用pandas做数据分析、数据处理,我相信同样也会用到这里面绝大部分功能。因此,本教程非常具有实用性。
此外,和其他教程不一样的是,其他教程大多数是根据pandas这个包下面的模块、类、函数等代码的层面对各项功能进行分类,初学者上手很慢。
本文根据实际的数据分析具体过程--数据导入、数据探索、数据清洗、数据分析、结果保存的顺序--按照各个功能的在整个数据分析流程中使用先后顺序,对pandas的各项功能进行了分类。
这样读者可以把本文作为一个速查手册,在自己动手数据分析的时候,可以对照着本教程,做到哪一步就知道去哪一块找。这样做依然是为了增强实用性。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
一、导入数据
读取csv文件:
pd.read_csv(file_name, index_col=0,sep=';',encoding='utf_8_sig',names=['customer','restaurant'], low_memory=False, parse_dates = ['date'])
# index_col=0表示把csv中的第一列作为dataframe的index
# encoding指定了用什么编码格式读取,主要解决中文字符识别的问题
# sep表示csv里面用什么作为分隔符,默认是英文逗号,这里改成了英文分号
# names表示手动指定每一列的名字
# low_memory=False表示让pandas可以处理同一列里面有多种数据类型的情况
# parse_dates指定了某一列为datetime格式
读取Excel文件:
pd.read_excel(file_name,sheet_name='process', header=None)
# sheet_name指定了读取excel里面的哪一个sheet
设置最多显示100行100列:
pd.set_option('display.max_columns',100)
pd.set_option('display.max_rows',100)
二、生成DataFrame
由dict生成DataFrame:
pd.Series(dict_name,name=series_name)
由Series生成DataFrame:
pd.DataFrame([Series1,Series2,Series3])
由ndarray生成dataframe:
dataframe_name = pd.DataFrame(ndarray_name,columns=data.columns,index=data.index)
# 第1个参数是一个ndarray
# 第2个参数columns表示新的dataframe的每一列column的列名是什么。同理index指定了行名
生成series:
pd.Series(series_data, name=series_name, dtype='float64')
# 第1个参数是用来生成series的数据
# name是series的名字
# dtype指定series里面数据的类型
三、数据探索
整体探索:
data.columns.values # 查看有哪些列
data.keys() # 查看有哪些列
data.describe() # 描述性统计
data.head(2).T # 查看前2行
data.shape # 查看dataframe的形状,是几行几列的
type(data[item][2]) # 查看某一个变量的数据类型
data.preferred_genre.value_counts() # 查看一个feature的每一种取值有多少样本
data.info()
查看一个feature的不重复值有哪些、数据类型、空值个数:
def unique(data,i):
variables = data.keys().values
item = variables[i]
try:
print(sorted(data[item].unique()))
except:
print(data[item].unique())
print('-'*5, item, '-'*5)
print(type(data[item][0]))
print('-'*5, data[item].isna().sum(), '-'*5)
提取值:
dataframe_name.iloc[:,:]
根据索引值提取DataFrame的一列,或者根据索引值提取Series的一个值:
dateframe_name[column_name]
data.column_name
# 这两种提取列的方法返回的内容是一样的
统计每一个组合有多少种情况:
data.value_counts()
提取一个dataframe里面,某一列的值不为0的所有的行:
dataframe.loc[dataframe.column_name != '0']
# 这一行的效果是,如果这个dataframe的这一列里面的某一个值为0,那么这一整行都会被剔除
# 取非的另一种方法是用~符号,注意,~符号后面的内容要用括号括起来
df = df[~(df.rumormongerName=="")]
查看index有没有重复值:
type1.index.is_unique
判断一个值是否是NaN:
dataframe_name.iloc[i,j] is np.nan
查看一个Series有哪些不重复的值:
dataframe.column_name.unique()
# 这一行,会把一个series里面所有可能出现的值列出来。
用某一列的值来筛选dataframe:
# 法一:
data[data['price'].values<=5000]
# 筛选data里面,price小于等于5000的所有observation
# 这里面,<=符号也可以换成>=、==、!=等判断符号
# 如果有多个条件,若多个条件时间是或的关系要用“|”而不能用or。同理是和的关系要用“&”。且每一个条件用小括号括起来。
# 例如:data[(data['payment_period']==0) & (data['trial_completed']==False)]
# 法二:
data.query('courier_id==10007871')
# 用id来查询数据
# 法三:
data[data['area'].isin('上海')]
# 用.isin()来提取包含某一个值的行
# 法四:
data[column_name].str.contains('上海')
# 返回的是一串True和False
求一个series的标准差:
data[cols].std()
四、修改index与column
修改一个DataFrame的columns的name:
# 法一:
dataframe_name.columns.name = None
# 这里表示删掉columns的name,也可以改成其他的
# 这里的columns改成index,就变成了该index的name
# 法二:
dataframe[column_name].rename('industry')
dataframe.rename(columns={0:'industry'})
# 用.rename()
修改一个dataframe的index:
dataframe_name.index=[1,2,3]
# 这里把一个拥有3个行的dataframe的index改成了1,2,3
修改dataframe的columns的顺序:
dataframe_name = dataframe_name[['direct', 'display', 'email', 'organic_search' 'social']]
# 具体做法是,在两层方括号里面,直接列出来你想要的columns顺序即可
对于column names使用正则表达式:
# 需要先定义一个正则表达式函数regular_function
temp = data.columns.to_list()
temp = list(map(regular_function,temp))
data.columns = temp
把某一列设置为index / 把index变成某一列值:
data.set_index('code')
data.reset_index()
五、数据清洗
合并多个dataframe:
# 法一:join方法
data = data.join(sub_data)
# 法二:concat方法
data = pd.concat([sub_data1,sub_data2],axis=1,join='outer')
# 法三:merge方法
data = data.merge(revenue,on=['year','month','day'],how='outer')
# join='outer'表示取所有dataframe的index的并集。改成inner表示取交集。默认值是outer
按照一一对应的原则,替换所有的值:
data.replace(to_replace=list_old,value=list_new)
# to_replace是要被替换的内容
# value是我们用什么来替换
# 如果这两个参数后面跟着的是两个列表,那么程序会用新列表的第0个位置替换掉就列表的第0个位置,位置上一一对应。
# 也可以在replace中使用正则表达式
data.replace(to_replace=r'其他[\s\S]*',value=5,regex=True)
# 仅对某一列进行替换
data.iloc[:,i] = data.iloc[:,i].str.replace(要被替换的内容, 替换成什么内容, regex=False)
在一个dataframe最后追加一行:
data.append()
行求和:
data['All'] = data.apply(lambda x: x.sum(),axis=1)
data['All'] = data.sum(axis=1)
对于满足特定条件的单元格赋值:
data.loc[data['age']>80,'comment']=1
用0填充空值:
data[column_name].fillna(0, inplace=True,, downcast='infer')
# downcast='infer'表示在填充完数据以后,推测出一下这一列的数据类型,并把这一列的数据类型改成最小的够用的数据类型。
# 例如,从float64降格成int64
删除重复值:
data.drop_duplicates(subset=0, keep='first', inplace=False, ignore_index=False, inplace=True)
# subset指定了对哪些列查找重复值
# keep指定了若出现重复值,保留下第几个值。改成'last'就是保留最后一个,False表示一个都不保留。
删除某一列:
# 法一:
data.drop(['row ID'], axis=1)
# 法二(删除最后一行):
del columns_needed[-1:]
在最前面插入新的一列:
col_name=data.columns.tolist()
col_name.insert(0,'new')
data=data.reindex(columns=col_name)
对某几个变量进行one-hot encoding:
pd.get_dummies(data[variable], prefix=variable,dtype='float')
把装了字符的series转成字母数和单词数:
data['name_length_letter']=data['name'].str.len()
data['name_length_word']=data['name'].str.count(' ') + 1
data[['name_length_word','name']]
# 使用.str
把dataframe里面的两个均是字符的列,用分隔符连接,放在一个新的列里面:
data[column1].str.cat(data[columns2],sep=',')
指定分号作为分隔符进行分列,一列变成多列:
data[column_name].str.split(';',expand=True)
提取一个Series最后一个非NaN的值所对应的index:
series_name.last_valid_index()
# 例如,一个Series的最后4个值是NaN,然后第五个值对应的index是"age",那么返回值就是"age"。
对dataframe进行随机抽样:
df.sample(n=20000)
删除dataframe中的NA值:
dataframe.dropna(axis='index',how='any',subset=['direct', 'display'])
# 第1个参数axis表示是对行进行操作
# 第2个参数how表示这一行有任何一个NA值,就把整个行删掉
# 第3个参数subset表示在寻找NA值的时候,只在这几个列里面找
把多个字符串列拼接在一起,生成新的一列:
data[column_new]=data[column1]+data[column2]+data[column3]
把两列数字型的列对应位置相乘,生成新的一列:
data['item_name_burger']=data['item_name_burger']*data['item_count']
根据某一列的值,对整个dataframe排序:
data.sort_values(by=column_name,ascending=False)
# by后面的内容,就是指定了根据哪个指标进行排序
# ascending=False表示从大到小排序。这个参数的默认值为True,也就是从小到大排序。
根据index的值对dataframe排序:
data[column_name].sort_index()
对于时间序列数据进行重抽样:
data.resample()
把某一列的数据类型转换成int型:
data['code'].astype('int')
# 括号里面还可以是int64,float等
六、关于时间的处理
对于单个时间元素的处理:
import calendar
from datetime import datetime
from datetime import timedelta
test = data['next_payment'][0] # 提取dataframe里面的一个时间
test # datetime
test.day # 提取几号
test.month # 提取月份
test.weekday() # 提取星期几,一周从星期一开始,周一是0
calendar.day_name[test.weekday()] # 提取星期几,文字
test.isocalendar()[1] # 获取是一年的第几个周
datetime.timestamp(test) # 将日期转换为时间戳
# 时间跨度
d1=timedelta(weeks=2)
d2=timedelta(days=2)
print(d1)
print(type(d1))
print(d1.days)
print(d2)
print(type(d2))
# 时间计算
print(datetime.now() - d1) # 计算距离今天两周前的datetime
print(datetime.now()-test) # 计算两个时间点之间的时间跨度,返回一个timedelta
对于dataframe里面的时间元素的处理:
data.next_payment.dt.year # 获取年份
data.next_payment.dt.month # 获取月份
data.next_payment.dt.day # 获取几号
data.next_payment.dt.hour # 获取小时数
data.next_payment.dt.minute # 获取分钟数
data.next_payment.dt.weekday # 获取是周几的数字
data.next_payment.dt.day_name() # 获取是周几的英文表达
data.next_payment.dt.dayofyear # 获取是一年的第几天
七、数据分析
计算相关系数矩阵并画图展示:
data_corr = data.corr()
plt.subplots(figsize=(5,5)) # 设置画面大小
sns.heatmap(data_corr, annot=True, vmax=1, square=True, cmap="Blues")
plt.show()
对于每一行或者每一列运行同一个函数:
dataframe_name.apply(function_name, axis=1,args=(5,))
# 注意:
# 1. 这里第一个参数直接输入function_name就行,不用加()
# 2. axis=1表示对于每一行运行同一个函数,axis=0表示对于每一个列运行同一个函数
# 3. 以axis=1为例,在运行的时候,dataframe的每一行会作为function的第一个参数传递到function里面。
# 4. args这个参数可以给function传递第二个及以后的参数。注意,它是元组的形式
# 另一个用apply的例子:
data['list_date'].apply(str) # 把日期行的变量转成字符型
两个dataframe对应位置相除:
dataframe_new = dataframe1.div(dataframe2,axis=1)
# 注意:要做这个运算,两个dataframe的columns和index必须是一样的。
cross tabulation,作用是选择若干列作为行,选择若干列作为列,组成一个矩阵,计算每一个格子的frequency:
pd.crosstab(df.Sex, df.Handedness, values=df.Age, values=df.Age, aggfunc=np.average)
# 第一个参数是cross tabulation的行,第二个函数是tabulation的列。这两个位置也可以放列表,里面装多个列
# 如果只是指定了第一第二个参数,也就是cross tabulation的行和列,那么每一个交叉的格子的值为每一个情况出现的频率
# values=df.Age表示每一个交叉出来的格子里用df.Age这一列作为原始值,aggfunc=np.average表示求Age的均值
# 如果加上normalize='index'会按照行求百分比
# 如果加上margins = True会在最后一行和最后一列加上一个求和行/列
数据透视表
pd.pivot_table(dataframe_name,values='convert',index=['tier'],columns=['Interaction'],aggfunc=np.sum)
# 第1个参数是原始数据
# 第2个参数values是填充在最终的数据透视表中,每一个格子的value是由什么算出来的
# 第3个参数index是最终的数据透视表的index是什么
# 第4个参数columns是最终的数据透视表的columns是什么
# 第5个参数aggfunc是用什么方法把values转换成最终的数据透视表中的值。这里可以填充numpy函数,我这里用的是求和,可以起用求平均等。
按照一定的指标提取需要的列:
columns_needed = [item for item in data.columns.to_list() if 'Cusine' in item or 'SpendNew' in item or 'CityLevelNew_' in item or 'context_1119' in item]
分类汇总
data[columns_needed].groupby('context_1119').mean()
# groupby()以后生成的是一个groupby对象,后面可以用mean()、sum()、count()、abs()(取绝对值)等方法
# groupby()之后也可以接.apply()
用dataframe的数据作图:
data[columns].plot(kind='bar')
# 后面的kind='bar'表示画的是条形图。其他还可以画的类型包括:
#‘line’ : 折线图,这个是默认选项
# 'barh’ : 水平的条形图。
#‘hist’ : histogram,直方图
#‘box’ : 箱型图
#‘area’ : area plot
#‘pie’ : 饼图
#‘scatter’ : 散点图
#‘hexbin’ : hexbin plot
#‘kde’ : Kernel Density Estimation plot
#‘density’ : same as ‘kde’
八、导出数据
保存成csv:
data_new.to_csv(filename,sep=':',header=False, encoding='utf_8_sig')
保存成excel文件:
data.to_excel(r'output_list1.xls')
保存成数据库文件:
from sqlalchemy import create_engine
engine= create_engine('sqlite:///foo.db')
df.to_sql('df', engine)
python panda是什么_如何最简单、通俗地理解Python的pandas库?相关推荐
- 有关python方面的论文_一篇文章可以带你理解python中的类
继续上一章的内容,上一章说到了python的核心部分-创建对象的各种名词的定义,包括:对象,类,多态,封装,继承,接口和内省,面向对象设计.还有不清楚的可以review一下前文.python核心部分创 ...
- python中yield讲解_「技术」如何深入理解Python中的 yield?
深入理解 yield 为了理解什么是 yield,你必须理解什么是生成器.在理解生成器之前,让我们先走近迭代. Iterables 当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象: ...
- 【Python】Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型
本文是Python实战–从入门到精通系列的第一篇文章: Python实战从入门到精通之一 – 教你深入理解Python中的变量和数据类型 文章目录 1.变量 1.1 变量命名规则 1.2 变量名称错误 ...
- 为什么一个程序中变量只能定义一次_#带你学Python# 从简单程序出发理解Python基本语法
欢迎回来. 通过上一篇文章,我们第一次触摸了Python,学会了如何用各种不同的方式运行Python的解释器.也介绍了很多工具和开发环境,是不是跃跃欲试了? 到这里,别的python教程就会从数据类型 ...
- mongodb 监听不到端口_干货|MongoDB简单操作和通过python进行操作
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 这次我们主要来简单的讨论一下在MongoDB中如何更新数据(修改数据),删除数据,以及 ...
- python turtle代码大全_通过构建简单的骰子游戏学习如何使用Python编程
Python是一种通用的编程语言,可以用于创建桌面应用程序.3D图形.视频游戏,甚至是网站.它是一种很棒的第一编程语言,因为它很容易学习,而且比复杂的语言(如C.C++或Java)更简单.Python ...
- python测开课程_【测开课程】02 Python基础
一.Python语言的特点(优点) 1.简单易用,支持在macOS.Windows.Unix等操作系统适用 2.编程语言,大量的数据结构.支持开发大型程序 3.错误检查很多 4.高级语言,内置灵活数组 ...
- python批量命名教程_《自拍教程69》Python 批量重命名音频文件,AV专家必备!
本篇主要学习如何Python自定义模块并调用该模块,并重点介绍Python正则表达式的强大的文本处理能力. 案例故事:任何一款终端产品只要涉及音频输出,就肯定涉及音频的解码, 作为一名专业的AV (A ...
- python ide如何运行_如何在Ubuntu上安装IDLE Python IDE
什么是IDLE? IDLE代表一世ntegratedd前夕大号opmentËnvironment.它是用于Python的IDE,使用Python语言本身编写,基于Tkinter并绑定到Tk小部件集. ...
最新文章
- C++ 虚函数表解析
- 错误名称:EntityCommandExecutionException
- mimind(思维导图软件)中文版
- OO实现ALV TABLE 十一:ALV的聚合,排序,过滤
- 【随感】i'm new here
- Deep Learning Toolkits 的比较(转)
- 易语言自定义数据类型转c,一步一步跟我学易语言之自定义数据类型
- thinkPHP5.0数据查询表达式生成技巧
- 封装的三级联动及应用
- Android 8.0 (35)----Android8.0.0-r4的OTA升级流程
- 程序员的 JavaScript 代码该如何让计算机搞懂?
- Linux系统中设置静态ip地址
- 4.3 数值分析: 简单迭代法的构造和收敛条件
- 见证“开放式多路供水”的技术难度应大于人类上天!
- LCD/LED驱动芯片(IC)/触摸IC资料汇总,仅供大家选型参考
- m3u8文件下载及合并
- 在excel中如何筛选重复数据_如何将Excel表中重复数据筛选出来?
- 概率论与数理统计-离散型随机变量基础知识
- 119全国消防日,我们要注意用火安全
- 数据库第十次作业-视图【带源码】
热门文章
- 安装Pytorch后torch.cuda.is_available()返回False问题解决
- Virtual Vertex Muster9—3D渲染农场管理软件
- c语言合并两个顺序表算法,顺序表的两种合并操作(C语言)
- ANC主动降噪,FFT方案与FxLMS方案比较
- H3C 无线优化经验
- 计算机内存怎么与频率匹配,内存频率,详细教您怎么查看内存条频率
- Java编译报错:无法将类XX中的构造器XX应用到给定类型
- xcode快捷方式 一 快速找到对应文件
- 一文读懂DeFi保险市场主要玩家及其运作机制 链捕手
- 因一个 Bug,谷歌、GitHub、亚马逊等网站全球大范围宕机!