本文总结了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库?相关推荐

  1. 有关python方面的论文_一篇文章可以带你理解python中的类

    继续上一章的内容,上一章说到了python的核心部分-创建对象的各种名词的定义,包括:对象,类,多态,封装,继承,接口和内省,面向对象设计.还有不清楚的可以review一下前文.python核心部分创 ...

  2. python中yield讲解_「技术」如何深入理解Python中的 yield?

    深入理解 yield 为了理解什么是 yield,你必须理解什么是生成器.在理解生成器之前,让我们先走近迭代. Iterables 当你建立了一个列表,你可以逐项地读取这个列表,这叫做一个可迭代对象: ...

  3. 【Python】Python实战从入门到精通之一 -- 教你深入理解Python中的变量和数据类型

    本文是Python实战–从入门到精通系列的第一篇文章: Python实战从入门到精通之一 – 教你深入理解Python中的变量和数据类型 文章目录 1.变量 1.1 变量命名规则 1.2 变量名称错误 ...

  4. 为什么一个程序中变量只能定义一次_#带你学Python# 从简单程序出发理解Python基本语法

    欢迎回来. 通过上一篇文章,我们第一次触摸了Python,学会了如何用各种不同的方式运行Python的解释器.也介绍了很多工具和开发环境,是不是跃跃欲试了? 到这里,别的python教程就会从数据类型 ...

  5. mongodb 监听不到端口_干货|MongoDB简单操作和通过python进行操作

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 这次我们主要来简单的讨论一下在MongoDB中如何更新数据(修改数据),删除数据,以及 ...

  6. python turtle代码大全_通过构建简单的骰子游戏学习如何使用Python编程

    Python是一种通用的编程语言,可以用于创建桌面应用程序.3D图形.视频游戏,甚至是网站.它是一种很棒的第一编程语言,因为它很容易学习,而且比复杂的语言(如C.C++或Java)更简单.Python ...

  7. python测开课程_【测开课程】02 Python基础

    一.Python语言的特点(优点) 1.简单易用,支持在macOS.Windows.Unix等操作系统适用 2.编程语言,大量的数据结构.支持开发大型程序 3.错误检查很多 4.高级语言,内置灵活数组 ...

  8. python批量命名教程_《自拍教程69》Python 批量重命名音频文件,AV专家必备!

    本篇主要学习如何Python自定义模块并调用该模块,并重点介绍Python正则表达式的强大的文本处理能力. 案例故事:任何一款终端产品只要涉及音频输出,就肯定涉及音频的解码, 作为一名专业的AV (A ...

  9. python ide如何运行_如何在Ubuntu上安装IDLE Python IDE

    什么是IDLE? IDLE代表一世ntegratedd前夕大号opmentËnvironment.它是用于Python的IDE,使用Python语言本身编写,基于Tkinter并绑定到Tk小部件集. ...

最新文章

  1. C++ 虚函数表解析
  2. 错误名称:EntityCommandExecutionException
  3. mimind(思维导图软件)中文版
  4. OO实现ALV TABLE 十一:ALV的聚合,排序,过滤
  5. 【随感】i'm new here
  6. Deep Learning Toolkits 的比较(转)
  7. 易语言自定义数据类型转c,一步一步跟我学易语言之自定义数据类型
  8. thinkPHP5.0数据查询表达式生成技巧
  9. 封装的三级联动及应用
  10. Android 8.0 (35)----Android8.0.0-r4的OTA升级流程
  11. 程序员的 JavaScript 代码该如何让计算机搞懂?
  12. Linux系统中设置静态ip地址
  13. 4.3 数值分析: 简单迭代法的构造和收敛条件
  14. 见证“开放式多路供水”的技术难度应大于人类上天!
  15. LCD/LED驱动芯片(IC)/触摸IC资料汇总,仅供大家选型参考
  16. m3u8文件下载及合并
  17. 在excel中如何筛选重复数据_如何将Excel表中重复数据筛选出来?
  18. 概率论与数理统计-离散型随机变量基础知识
  19. 119全国消防日,我们要注意用火安全
  20. 数据库第十次作业-视图【带源码】

热门文章

  1. 安装Pytorch后torch.cuda.is_available()返回False问题解决
  2. Virtual Vertex Muster9—3D渲染农场管理软件
  3. c语言合并两个顺序表算法,顺序表的两种合并操作(C语言)
  4. ANC主动降噪,FFT方案与FxLMS方案比较
  5. H3C 无线优化经验
  6. 计算机内存怎么与频率匹配,内存频率,详细教您怎么查看内存条频率
  7. Java编译报错:无法将类XX中的构造器XX应用到给定类型
  8. xcode快捷方式 一 快速找到对应文件
  9. 一文读懂DeFi保险市场主要玩家及其运作机制 链捕手
  10. 因一个 Bug,谷歌、GitHub、亚马逊等网站全球大范围宕机!