pandas常用操作

作者: 卅清 | 来源:发表于2020-02-01 15:53 被阅读0次

    1.pandas优势

    便捷的数据处理能力

    读取文件方便

    封装了Matplotlib、Numpy的画图和计算

    2.pandas主要的两种数据结构

    1.Series

    表示一维数据,会自动为这一维数据创建行索引。

    创建series:index默认值为整数序列,也可自定义。

    se = pd.Series([0.25,0.5,0.75,1.0])

    se

    0   0.25

    1    0.50

    2    0.75

    3    1.00

    dtype: float64

    Series本身的属性有两种,index,values

    se.index

    RangeIndex(start=0, stop=4, step=1)

    se.values

    array([0.25, 0.5 , 0.75, 1. ])

    排序:

    使用series.sort_values(ascending=True)对内容进行排序

    series排序时,只有一列,不需要参数

    se.sort_values()

    使用series.sort_index()对索引进行排序

    se.sort_index()

    2.Dataframe

    既有行索引,又有列索引,类似于二维数组

    行索引,表明不同行,横向索引,叫index

    列索引,表名不同列,纵向索引,叫columns

    创建Dataframe

    pd.DataFrame(data)

    pd.DataFrame.from_dict(data)

    在已有的DataFrame中,增加N列

    df.insert() 下标,字段名,添加数据

    allow_duplicates=True:允许添加重复的列

    df.insert(2,"C",[333,44,55])  

    常用属性:

    df.shape  得到dataframe是几行几列的元组

    (3, 2)

    df.index   DataFrame的行索引列表

    RangeIndex(start=0, stop=3, step=1)

    df.columns DataFrame的列索引列表

    Index(['a', 'b'], dtype='object')

    df.values  直接获取其中array的值,通过type函数,可得到

    numpy.ndarray

    df.values

    array([[0, 0],

          [1, 2],

          [2, 4]], dtype=int64)

    转置 T

    df.T

        0 1 2

    a  0 1 2

    b  0 2 4

    常用方法:

    df.head()  如果不补充参数,默认前5行。填入参数N则显示前N行

    df.tail()       如果不补充参数,默认后5行。填入参数N则显示后N行

    DataFrame索引的设置

    修改行列索引值,必须整体全部修改

    li = ["A","B"]

    df.columns=li

    重设索引值

    设置新的下标索引

    reset_index(drop=False)

    drop:默认为False,不删除原来索引,如果为True,删除原来的索引值

     index A B

    0  0  0  0

    1  1  1   2

    2  2  2  4

    以某列值设置为新的索引

    set_index(keysdrop=True)

    keys : 列索引名称或者列索引名称的列表

    drop : boolean, default True.当做新的索引,删除原来的列

    索引操作

    直接使用行列索引(先列后行) 列是列名,如果是数字,按照行索引取值。

    df['A'][2]

    结合loc或者iloc使用索引

    使用loc:只能指定行列索引的名字 先行后列

    df.loc[0,'A':'B']

    A     0

    B    0

    Name: 0, dtype: int64

    使用iloc可以通过索引的下标去获取  先行后列

    df.columns.get_indexer(["A","B"]) 获取列中指定字段的下标

    df.index.get_indexer([1])   获取行中指定字段的下标

    df.index[下标] 根据下标得行中指定字段

    df.columns[下标]   根据下标得列中指定字段

    df.iloc[1,0:2]

    A    1

    B    2

    Name: 1, dtype: int64

    使用ix组合索引

    ix下标和名称组合索引

    df.ix[1:3,"B"]

    赋值操作

    df.A = 1

    df["A"] = 1

    排序

    对内容排序

    使用df.sort_values(key=, ascending=)对内容进行排序

    单个键或者多个键(放入列表中)进行排序,默认升序

    ascending=False:降序

    ascending=True:升序

    df.sort_values(by="B",ascending=False)

    对索引排序

    使用df.sort_index对索引进行排序

    DataFrame运算

    算术运算

    add()  进行数学运算加上具体的一个数字

    df.A.add(1)

    sub()   进行数学运算减上具体的一个数字

    df.A.sub(1)

    逻辑运算

    逻辑运算符: <、 >、|、 &

    df[(df.A>0)&(df.B<3)]

    逻辑运算函数:

    query(expr)

    expr:查询字符串

    df.query('A>0 & B<3')

    isin(values1) 指定值是否在values1列表中

    df.A.isin([1,2,3])

    df.isin([1])

    统计运算

     describe() 得到总计数,平均值,标准差,最小值,25%分位数值

    50%分位数值(中位数),75%分位数值,最大值

    df.describe()

    统计函数

    min(), max() , mean(), median(), var(), std()

    idxmax()、idxmin() 求出最大值/最小值的位置

    0 代表列求结果, 1 代表行求统计结果

    df

        A B

    0  1   0

    1   1  2

    2   1  4

    df.max(1)

    0 1

    1    2

    2    4

    dtype: int64

    df.idxmax(1)

    0   A

    1    B

    2    B

    dtype: object

    df.idxmax(0)

    A    0

    B    2

    dtype: int64

    累计统计函数

    cumsum计算前1/2/3/…/n个数的和

    df["A"].cumsum()

    0    1

    1    2

    2    3

    cummax计算前1/2/3/…/n个数的最大值

    cummin计算前1/2/3/…/n个数的最小值

    cumprod计算前1/2/3/…/n个数的积

    自定义运算

    apply(func, axis=0)  按行或列进行计算

    func:自定义函数

    axis=0:默认是列,跨行,axis=1为行, 跨列进行运算

    df.apply(lambda x: x.max() - x.min(),axis=0)

    A    0

    B    4

    dtype: int64

    applymap(func)不分行列,所有元素进行计算

    df.applymap(lambda x: x+2)

    pandas画图

    DataFrame.plot(x=Noney=Nonekind='line')  

    x : label or position, default None 指x轴的标签或位置参数,

    y : label, position or list of label, positions, default None

    Allows plotting of one column versus another

    kind : str  选择需要的图形,默认折线图

    ‘line’ : line plot (default) 折线图

    ‘bar’ : vertical bar plot 条形图

    ‘barh’ : horizontal bar plot横向条形图

    ‘hist’ : histogram 柱状图

    ‘pie’ : pie plot 饼图

    ‘scatter’ : scatter plot 散点图  需要传入columns方向的索引

    df.plot.bar(x='A',y='B')

    文件读取与存储

    csv

    读取:pandas.read_csv()

    filepath_or_buffer:文件路径

    sep:字符串,分割符,默认值为‘,’

    delimiter : str,default None 定界符,备选分隔符(如果指定该参数,则sep参数失效)

    usecols:指定读取的列名,列表形式

    names:添加表头,列表形式

    encoding:编码格式,默认utf8

    data = pd.read_csv("D:\\BaiduNetdiskDownload\\company_sql.csv",sep=",",encoding='gbk')

    存储:pandas.to_csv()

    filepath_or_buffer:文件路径

    sep :字符串,分隔符

    colums=[],想存储的列

    index= ,false,存储不需要行索引

    header=false,存储不需要列索引

    mode= a:追加 w:重写

    data.head().to_csv("D:\\BaiduNetdiskDownload\\company.csv",columns=["companyId","companyFullName"],mode="a",index=False)

    sql

    读取pandas.read_sql(sqlconindex_col=Nonecoerce_float=Trueparams=Noneparse_dates=Nonecolumns=Nonechunksize=None)

    sql:执行的sql语句

    con:连接数据库操作,使用SQLAlchemy可以使用该库支持的任何数据库

    index_col:要设置为索引的列

    coerce_float:尝试将非字符串,非数字对象(如decimal.Decimal)的值转换为浮点,这对SQL结果集很有用

    columns:从SQL表中选择的列名列表(仅在读取表时使用)

    import pymysql

    con = pymysql.connect(host="127.0.0.1",user="root",password="wuxin",db="test",charset="utf8")

    data_sql = pd.read_sql(sql="select * from student",con=con)

    存储:pandas.to_sql()

    name: 输出的表名

    con: 与read_sql中相同,数据库链接

    if_exits: 三个模式:fail,若表存在,则不输出;replace:若表存在,覆盖原来表里的数据;append:若表存在,将数据写到原表的后面。默认为fail

    index:是否将df的index单独写到一列中

    index_label:指定列作为df的index输出,此时index为True

    dtype: 指定列的输出到数据库中的数据类型。字典形式储存:{column_name: sql_dtype}。常见的数据类型有sqlalchemy.types.INTEGER(), sqlalchemy.types.NVARCHAR(),sqlalchemy.Datetime()等,如果不提供dtype,to_sql会自动根据df列的dtype选择默认的数据类型输出.

    sqlalchemy 连接数据库模式:

    '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名?charset=utf8'

    from sqlalchemy import create_engine

    engine = create_engine(

        "mysql+pymysql://root:root@localhost:3306/test?charset=utf8")

    data_sql.to_sql(name="student",con=engine,index=False,if_exists="append")

    缺失值处理

    先判断是否有缺失值NaN

    pd.isnull(df) /pd.notnull(df)/df.isnull()/df.notnull()

    存在缺失值nan, 并且是np.nan:

     1.直接删除 dropna(axis=0/1)

     2.替换缺失值 fillna(value, inplace=True)

        value:替换成的值

        inplace:

        True:会修改原数据

        False:不替换修改原数据,生成新的对象

    若是特殊的符号值,如?等,

    1 先替换'?'为np.nan

    df.replace(to_replace=, value=)

    to_replace:替换前的值

    value:替换后的值

    2.再进行缺失值的处理

    数据离散化

    离散化:把连续型数据切分为若干“段”,即把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。

    优势:①算法需要。②离散化可以有效地克服数据中隐藏的缺陷:使模型结果更加稳定。③降低时间、空间复杂度

    流程:

    对数据进行分组

    自动分组:pd.qcut(data, bins)

    自定义分组:pd.cut(data, bins)

    对数据进行分组将数据分组 一般会与value_counts搭配使用,统计每组的个数

    series.value_counts():统计分组次数

    对分好组的数据求哑变量

    pandas.get_dummies(dataprefix=None)

    data:array-like, Series, or DataFrame

    prefix:分组名字

    合并

    concat 索引合并

    pd.concat([data1,data2],axis=1)

    data数据类型为Dataframe类型

    按照行或列进行合并,axis=0为列索引,axis=1为行索引

    merge进行按照键合并

    pd.merge(left, right, how='inner', on=[左右共同字段], left_on=None, suffixes=('_x', '_y'))

    可以指定按照两组数据的共同键值对合并或者左右各自

    left: A DataFrame object

    right: Another DataFrame object

    how: inner,outer,left,right

    left_on=None, right_on=None:指定左右键

    suffixes:如果和表合并的过程中遇到有一列两个表都同名,但是值不同,合并的时候又都想保留下来,就可以用suffixes给每个表的重复列名增加后缀。

    交叉表与透视表:

    交叉表:交叉表用于计算一列数据对于另外一列数据的分组个数(寻找两个列之间的关系)

    pd.crosstab(value1, value2)

    透视表:

    DataFrame.pivot_table([], index=[])

    分组与聚合

    分组与聚合通常是分析数据的一种方式,通常与一些统计函数一起使用,查看数据的分组情况

    分组:

    data.groupby(by,)

    key:按key分组,多个key,用列表

    as_index:true,false保存行索引

    聚合:就是将分组后的数据,count/sum等。

    相关文章

      网友评论

        本文标题:pandas常用操作

        本文链接:https://www.haomeiwen.com/subject/pxdgthtx.html