添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Pandas手册自用

读取数据

1、pd.read_csv:读取csv文件或者txt

ratings = pd.read_csv(fpath)

2、pd.read_csv:读取txt文件,自己指定分隔符、列名

pvuv = pd.read_csv(
    fpath,
    sep="\t",  #设置的分隔符
    header=None,  #说明txt文件没有列索引,
    names=['pdate', 'pv', 'uv'] #自己设置索引
)

在遇到以"::"为分隔符

需要指明引擎engine = 'python'

pvuv = pd.read_csv(
    fpath,
    sep="::",  #设置的分隔符
    engine='python',
    header=None,  #说明txt文件没有列索引,
    names=['pdate', 'pv', 'uv'] #自己设置索引
)

3、pd.read_excel:读取excel

read_excel(io, sheetname=0,skiprows=None)

常用参数sheetname:填入整形,从0开始选取工作表

skiprows 忽视前几行 :一般前几行有无用数据才会用到

4、pd.read_sql:读取数据库

import pymysql
conn = pymysql.connect(
        host='127.0.0.1',
        user='root',
        password='12345678',
        database='test',
        charset='utf8'
mysql_page = pd.read_sql("select * from crazyant_pvuv", con=conn)


5、df.to_csv(index=False)

一般写入dataframe时要设置index=False否则自动写入一行索引


数据的常用操作(如查看缺失值信息等)

1、dataframe.head() :读取前五行

写入整形可以显示前N行

2、dataframe.shape : 去读数据的行数和列数

返回一个元组,(行数,列数)

3、dataframe.columns :获取列索引值

返回的是Index(['userId', 'movieId', 'rating', 'timestamp'], dtype='object')

4、ratings.dtypes: 获取数据的格式类型

比如:字串数据用str_

userId         int64
movieId        int64
rating       float64
timestamp      int64
dtype: object

5、dataframe['列名'].value_counts() :查询每个数据的次数

获取的series对象可以通过.index获取索引,用.value获取值

温差正常    187
温差大     178
Name: wencha_type, dtype: int64

6、dataframe.describe() :统计所有数据列的一些信息比如最大值最小值

其中std是标准差

7、dataframe["列名"].mean() :查找指定列的平均数

8、dataframe['列'].max() .min: 查询最大最小

9、dataframe['列'].unique() :用于给字符串列进行分类

df["fengxiang"].unique()
array(['东北风', '北风', '西北风', '西南风', '南风', '东南风', '东风', '西风'], dtype=object)

10、df.cov() :获取协方差

1. 协方差:***衡量同向反向程度***,如果协方差为正,说明X,Y同向变化,协方差越大说明同向程度越高;如果协方差为负,说明X,Y反向运动,协方差越小说明反向程度越高。

11、df.corr() 获取相关系数

相关系数:***衡量相似度程度***,当他们的相关系数为1时,说明两个变量变化时的正向相似度最大,当相关系数为-1时,说明两个变量变化的反向相似度最大

12、df["aqi"].corr(df["bWendu"]) 单独查看某两列的相关系数


创建数据结构

1、 pd.Series([数据集],index=[设置的索引],name='')

第一个参数可以传一个列表数据集

index是设置索引值,默认是0,1,2,3。。。

name是设置series的列名,在后面数据合并concat,合并列会用到

2、创建空Series

se = pd.Series(dtype='float64')

3、Series的查询方法

series[索引] :用于查询某一个数据

series.values :获取所有的数据

series.index : 获取索引

4、pd.DataFrame(字典) :通过字典来创建 ,其中,字典的键会作为列的索引

data={
        'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
        'year':[2000,2001,2002,2001,2002],
        'pop':[1.5,1.7,3.6,2.4,2.9]
df = pd.DataFrame(data)

5、创建空dataframe

df_empty = pd.DataFrame(columns=['A', 'B', 'C', 'D'])

6、条件查询的注意事项

df.loc[(df["bWendu"]<=30) & (df["yWendu"]>=15) & (df["tianqi"]=='晴') & (df["aqiLevel"]==1), :]

如果是或 就用| 如果是且就用&

另外自己用的少的是,可以编写函数查询:

def fun(d):
    return d['ymd'].str.startswith('2018-09')
data.loc[fun,:]

记住 dataframe.loc[,]

如果有逗号隔开,逗号后面是要显示的列,比如我写

dataframe.loc[查询条件,'ymd']

是只查ymd 返回series

如果是列表或者: 这是返回dataframe


查询方法很多,推荐用loc

其实直接用df[df[条件]] 的格式也可以查



7、按多条件查询修改!!!

def get_wendu_type(x):
    if 60>= x["time_len"] >= 90:
        return "潜水用户"
    if x["time_len"] > 90:
        return "流失用户"
    else:
        return "活跃用户"
user.loc[:,"type"] = user.apply(get_wendu_type,axis=1)

传入df对象,然后选定df对象中修改的片段,然后return返回出来

当如果是想要增加一列,则user.loc[:, '新字段' ] = 。。。。



新增数据列

1、直接赋值法

比如拿到这个数据,我想添加一列温差

通过直接赋值

df.loc[:,'wencha'] = df['bWendu']-df['yWendu'] 

就会自动添加一列温差了


缺失值处理(isnull和notnull,dropna,fillna)

大纲:isnull和notnull,dropna,fillna

Pandas使用这些函数处理缺失值:


  • isnull和notnull:检测是否是空值,可用于df和series
  • dropna:丢弃、删除缺失值
    • axis : 删除行还是列,{0 or ‘index’, 1 or ‘columns’}, default 0
    • how : 如果等于any则任何值为空都删除,如果等于all则所有值都为空才删除
    • inplace : 如果为True则修改当前df,否则返回新的df
    • subset:指定的字段,如果有空才删
  • fillna:填充空值
    • value:用于填充的值,可以是单个值,或者字典(key是列名,value是值)
    • method : 等于ffill使用前一个不为空的值填充forword fill;等于bfill使用后一个不为空的值填充backword fill
    • axis : 按行还是列填充,{0 or ‘index’, 1 or ‘columns’}
    • inplace : 如果为True则修改当前df,否则返回新的df



以下以一个案例讲解过程:

这是最开始没有处理的数据

我们把他处理成

步骤1:先找出所有空值

import pandas as pd
df = pd.read_excel(r'C:\Users\zero\Desktop\l_env\Scripts\jupyter\learnpandas\datas\student_excel\student_excel.xlsx',skiprows=2)
df

其中NaN就是空的意思


步骤2:删除空行

2.1 删除空白行

看前面大纲,axis参数是设置删除行还是列,行是0,列是1

,inplace参数是要不要在原来的数据上修改的意思

how代表删除的模式:其中用all的话,如果一整行或者一整列都是NaN,才会被删除,而如果是any,只要在某行或某列中,出现了一个NaN,就会被删除,



比如我先删除空白行 ,参数用all

df2 = df.dropna(axis=0,how='all',inplace=False)
df2               

如果用any

2.2 删除空白列:

df3 = df2.dropna(axis=1,how='all',inplace=False)
df3

第三步:填充数据

3.1 分数中有NaN,我希望填充0

df4 = df3.copy()
df4.loc[:,'分数'] = df4['分数'].fillna(0)
df4

这里有个小问题,就是要用copy函数,不然会有一个报错



3.2 用fillna中的method参数

method参数,可以选ffill和bfill

其中ffill是指,填充的值,会按上一个值填充

而bfill是按下面一个值填充

df4.loc[:,'姓名'] = df4['姓名'].fillna(method='ffill')
df4

步骤四:

dataframe.to_excel()写入excel即可


数据排序(.sort_values(ascending=True, inplace=False))

1、Series.sort_values(ascending=True, inplace=False)

ascending如果是true,说明是升序

inplace是指是否在原数据修改

2、DataFrame.sort_values(by, ascending=True, inplace=False)

by指按排序的列

其中可以分别设置不同列的升降序

# 分别指定升序和降序
df.sort_values(by=["aqiLevel", "bWendu"], ascending=[True, False])


Merge主键的连接 merge连接用how

大纲

merge的语法:

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)


  • left,right:要merge的dataframe或者有name的Series
  • how:join类型,'left', 'right', 'outer', 'inner'
  • on:join的key,left和right都需要有这个key
  • left_on:left的df或者series的key
  • right_on:right的df或者seires的key
  • left_index,right_index:使用index而不是普通的column做join
  • suffixes:两个元素的后缀,如果列有重名,自动添加后缀,默认是('_x', '_y')



关于merge可以用来补充不连续的数据

比如对于日期,有一段日期是不连续的,需要自己创建一个连续的日期,然后去关联


数据合并 连接用join模式

pandas.concat(objs, axis=0, join='outer', ignore_index=False)

  • objs:传入合并的列表,内容可以是DataFrame或者Series,可以混合
  • axis:默认是0代表按行合并,如果等于1代表按列合并
  • join:合并的时候索引的对齐方式,默认是outer join,也可以是inner join
  • ignore_index:是否忽略掉原来的数据索引


添加行

示例:

有两个dataframe按行合并

表1

表2

这里需要说明join参数,join如果选了inner,则因为没有F列,表2没有E列,合并会自动去除这两列

concat_df1 = pd.concat([df1,df2],join='inner',axis=0,ignore_index=True)
concat_df1

如果join参数用outer

添加列

se = pd.Series(list(range(8)),name='G')
pd.concat([concat_df2,se],axis=1,join='outer',ignore_index=True)

关键是理解axis的参数


数据分组聚合 df.groupby()

比如根据月份,找出每月bWendu的最大值等

最简单用法:

tianqi.groupby(['ym']).max()

根据'ym'列的指,算出每一个数据列的最大值、

其中groupby可以传入列表,会变成二维分组


分层索引

重要知识 】在选择数据时:

元组(key1,key2)代表筛选多层索引,其中key1是索引第一级,key2是第二级,比如key1=JD, key2=2019-10-02

列表[key1,key2]代表同一层的多个KEY,其中key1和key2是并列的同级索引,比如key1=JD, key2=BIDU


记住,()是分级,【】是同级

slice(None)是指把同一级所有所有合并


重复值

df.drop_duplicated(subset=None,keep=“first”,inplace=False)

subset:指明需要去重的列名,默认识别所有列

keep:有first,last两个取值 ,分别代表保留哪一个


日期格式的处理

pd.to_datetime(obj)

一般配合df,loc[:,''] = pd.to_datetime()来使用,修改某列为日期结构

当用to_datetime处理后

可以通过以下几个参数获取日期的其他信息

其中,现在weekday_name 使用会报错,需要用day_name() 要加括号

另外当用to_datetime处理后,还可以做时间差的计算

直接相减即可

new = Ruser['recently_logged'] - Ruser['register_time']
0         0 days 00:00:00
1         0 days 00:01:00
2         0 days 00:00:00
3         0 days 00:00:00
4         0 days 00:34:00