python大数据处理模块pandas

 

引言

Pandas是一个开源的Python库,使用其强大的数据结构提供高性能的数据处理和分析工具。在Pandas之前,Python主要用于数据管理和准备。它对数据分析的贡献很小。Pandas解决了这个问题。使用Pandas,无论数据来源如何 - 加载,准备,操作,建模和分析,我们都可以完成数据处理和分析中的五个典型步骤。它可以将数据从不同文件格式加载到内存数据对象的工具,然后进行数据清洗和预分析。

 

pandas数据结构介绍

  • Series:一种类似于一维数组的对象,它是由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据即可产生简单的 Series。
  • DataFrame:一个表格型的数据结构,含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等),DataFrame既有行索引也有列索引。

 

Series

series 和字典有些类似,字典是通过 key 索引找到对象的 value。series 通过 index 索引找到一组对象的 value。series 用的不多,主要介绍下怎么创建,我们把重点篇幅放在 dateframe 上。

1、一维数组创建

 可以通过 Series() 创建 Series 对象,index可以指定,也可以不写。

import pandas

# 指定index值
series = pandas.Series([3999,4999],index=['xiaomi','huawei'])
print(series)

输出:

 

import pandas

# 默认index
series = pandas.Series([3999,4999])
print(series)

输出:

 

2、字典创建

import pandas

dic = {'xiaomi':3999,'huawei':4999}
series = pandas.Series(dic)
print(series)

输出:

 

Dateframe

Dateframe 有两个索引,一个行索引,另一个列索引。想象一下 excel 表格,就比较好理解了。

  • 行索引:index,区分不同的行,axis = 0
  • 列索引:column:区分不同的列,axis=1

 

1、创建 Dateframe 表格的几种方式:

import pandas


'''通过列表创建'''
# 一、默认方式
df = pandas.DataFrame([['xiaomi',3999],['huawei',4999]])
# 二、list(dict) 方式
df = pandas.DataFrame([{'xiaomi':3999,'huawei':4999},{'xiaomi':2999,'huawei':5999}])
# 三、指定 index 和 columns
df = pandas.DataFrame([['xiaomi',3999],['huawei',4999]],index=['100','101'],columns=['品牌','价格'])


'''通过字典创建'''
dic = {'xiaomi':[3999,2999],'huawei':[4999,5999]}
df = pandas.DataFrame(dic)


'''创建一个空表格'''
# 指定列名的空表格
df = pandas.DataFrame(columns=['xiaomi','huawei'])

 

2、向表格中添加一行/列数据

'''添加行数据'''
# ignore_index=True 要记得加上,表示新的表格不按原来的索引,从0开始自动递增
df = pandas.DataFrame({'xiaomi':[3999,2999],'huawei':[4999,5999]})
# 添加一行数据
df = df.append({'xiaomi':1999,'huawei':6999},ignore_index=True)
# 添加多行数据,使用list,list内元素为dict
df = df.append([{'xiaomi':1999,'huawei':6999},{'xiaomi':999,'huawei':7999}],ignore_index=True)


'''添加列数据'''
# 方式一
df = pandas.DataFrame({'xiaomi':[3999,2999],'huawei':[4999,5999]})
# 直接命名列名,增加列的元素个数要跟原数据列的个数一样。
df['颜色'] = ['白色','黑色']

# 方式二
# 第一个参数为列的位置,第二个参数为列名,第三个为列的values
df.insert(2,'颜色',['白色','黑色'])

# 添加一列空值
df['颜色']=numpy.nan

 

3、修改数据

df = pandas.DataFrame({'xiaomi':[3999,2999],'huawei':[4999,5999]})

'''方式一'''
# 使用loc方法,loc[row_index,column]
df.loc[0,'xiaomi'] = 1999
df.loc[1,'huawei'] = 6999

'''方式二'''
# 使用iloc方法,iloc[row_index,column_index]
df.iloc[0,0] = 1999
df.iloc[1,1] = 6999

 

4、查询数据

df = pandas.DataFrame({'xiaomi':[3999,2999,2000,3000],'huawei':[4999,5999,4000,5000]})

'''查询数据的几种方式'''
# 列名查询
df['xiaomi']
df[['xiaomo','huawei']]

# 行索引查询
df[0:]   # 第0行及以后的行索引,相当于全部数据
df[-1:]  # 最后一行
df[1:3]  # 第1行到第2行,不包含第3行

# loc方法
df.loc[1,'huawei']  # 精准查询5999
df.loc[0:2,'huawei'] # huawei列第0到2行
df.loc[[1,2],['xiaomi','huawei']]  #指定第1行到第2行,xiaomi和huawei列的数据
df.loc[df['xiaomi']==2000,'huawei']  #条件查询,列xiaomi值为2000对应列huawei的值
df.loc[df['xiaomi']==2000,['huawei','xiaomi']]    #条件查询,列xiaomi值为2000对应列huawei、xiaomi的值

#iloc方法
df.iloc[0,0]    # 精准查询3999
df.iloc[[1,3],0:1]   #第1行和3行,第0列和第1列的数据
df.iloc[1:3,[0,1]]   # 第1行到第2行(不含第3行),第0列和第1列的数据



# 查询表格中某列值为nan,使用 isna()
df.loc[df['xiaomi'].isna(), ['huawei']]     #条件查询,列xiaomi值为nan对应列huawei的值


# 多个条件查询:与(&)、或(|)
df.loc[df['xiaomi'] ==2000&df['huawei']==4000, ['huawei','xiaomi']]    #条件查询,列xiaomi值为2000并且huawei值为4000 对应列huawei、xiaomi的值

 

5、删除数据

df = pandas.DataFrame({'xiaomi':[3999,2999,2000,3000],'huawei':[4999,5999,4000,5000]})

# 删除第1和3行,axis : {0 or 'index', 1 or 'columns'}
df.drop([1,3],axis=0,inplace=True)

# 删除列,axis : {0 or 'index', 1 or 'columns'}
df.drop(['xiaomi'],axis=1,inplace=True)
# 或者使用del ,也能达到同样效果
del df['xiaomi']

# 根据查询条件删除行
df.drop(df.loc[df['xiaomi'].isna()].index,inplace = True) #删除xiaomi值为nan的行

 

6、替换所有表格中的 nan

# 将 nan 替换为0,inplace=True 原表格生效
df.fillna(0,inplace=True)

 

7、修改列名

df = pandas.DataFrame({'xiaomi':[3999,2999],'huawei':[4999,5999],'颜色':['白色','黑色']})
# 方式一
# rename方法
df.rename(columns={'xiaomi':'xiaomi','huawei':'huawei'},inplace=True)

# 方式二
# 直接修改所有列名
df.columns = ['xiaomi','huawei','颜色']

 

8、调整列顺序

df = pandas.DataFrame({'xiaomi':[3999,2999],'huawei':[4999,5999],'颜色':['白色','黑色']})
# 只改变列的顺序,values随着列的顺序移动
df = df[['xiaomi','颜色','huawei']]

 

9、sort_values 方法排序

# 按'xiaomi'列values 排倒序。ascending=Ture 正序,False 倒序
df.sort_values(by=['xiaomi'], ascending=False,inplace=True)

 

10、分组统计

df = pandas.DataFrame({'xiaomi':[3999,2999,1999,999],'huawei':[4999,5999,6999,7999],'颜色':['白色','黑色','白色','黑色']})
#根据颜色分组,对各列进行计数。分组过后组名会变成外索引,as_index=False,不变成索引
df = df.groupby(['颜色'],as_index=False).count()
#根据颜色分组,对xiaomi来计数
df = df.groupby(['颜色'],as_index=False).xiaomi.count()
#根据颜色分组,对xiaomi来计数
df = df.groupby(['颜色'],as_index=False)['xiaomi'].count()


#agg函数的用法:
#用法1:对一列用2个函数
df = df.groupby(['颜色'],as_index=False).agg(['mean','max'])
#用法2:对不同的列所用不同的聚合函数
df = df.groupby(['颜色'],as_index=False).agg({'xiaomi':'sum', 'huawei':'sum'})

 

11、dateframe 转成 list、dict

df = pandas.DataFrame({'xiaomi':[3999,2999,1999,999],'huawei':[4999,5999,6999,7999],'颜色':['白色','黑色','白色','黑色']})
# 转成list[list]
df.values.tolist()

# 转成dict,orient参数有6组值,源码里有注解,按需取即可
def to_dict(self, orient="dict", into=dict):
    """
    Convert the DataFrame to a dictionary.

    The type of the key-value pairs can be customized with the parameters
    (see below).

    Parameters
    ----------
    orient : str {'dict', 'list', 'series', 'split', 'records', 'index'}
        Determines the type of the values of the dictionary.

        - 'dict' (default) : dict like {column -> {index -> value}}
        - 'list' : dict like {column -> [values]}
        - 'series' : dict like {column -> Series(values)}
        - 'split' : dict like
          {'index' -> [index], 'columns' -> [columns], 'data' -> [values]}
        - 'records' : list like
          [{column -> value}, ... , {column -> value}]
        - 'index' : dict like {index -> {column -> value}}

        Abbreviations are allowed. `s` indicates `series` and `sp`
        indicates `split`.

    into : class, default dict
        The collections.abc.Mapping subclass used for all Mappings
        in the return value.  Can be the actual class or an empty
        instance of the mapping type you want.  If you want a
        collections.defaultdict, you must pass it initialized.
'''

 

12、DataFrame与标量的加法运算

# 方式一
df = pandas.DataFrame({'xiaomi':[3999,2999,1999,999],'huawei':[4999,5999,6999,7999]})
# dataframe 所有的元素都+1000
df = df +1000
# dataframe 某一列元素+1000
df['xiaomi'] = df['xiaomi']+1000

# 方式二
# dataframe 所有的元素都+1000
df = df.add(1000)
# 所有元素都加1000,fill_value给所有缺失值添加默认值
df = df.add(1000,fill_value=100)

 

13、去重

# 去掉重复数据。keep='first' 默认保留第一个出现的数据
df = df.drop_duplicates(subset=None, keep='first', inplace=False)

# 示例
# dataframe某一行元素全部相同才能去除
df = df.drop_duplicates()

# 根据 'xiaomi'、'huawei' 组合列删除相同行
df = df.drop_duplicates(['xiaomi','huawei'],keep='first',inplace = False)

 

14、重建索引

对表格进行数据处理后,索引被打乱。若要恢复成从0开始递增,使用 reset_index() 方法,参数 drop=True,新建索引后,将原索引删除。 

# drop=False 表示不删除原索引。drop=True 删除原索引。
df= df.reset_index(drop=True)

重新建立索引后:

 

15、修改列类型

import numpy

# 修改小米这一列类型为 int
df['xiaomi'] = df['xiaomi'].astype(numpy.int64)

# 修改华为这一列类型为 str
df['huawei'] = df['huawei'].astype(numpy.str0)

# 修改整个表类型为 str
df = df.applymap(str)

 

16、保留小数

# 列“xiaomi” 保留两位小数,用 round 函数即可
df['小米'] = round(df['xiaomi'], 2)

 

17、替换字符

import pandas

df = pandas.DataFrame({'xiaomi':['abc','bcd','cde',],'huawei':['aaa','bbb','ccc']})
# 把列xiaomi元素中包含字符'b'的都替换成新字符'h'
df['xiaomi'] = df['xiaomi'].replace('b','h',regex=True)

 

18、转置操作

# 转置,类似excel表格中的转置功能

import pandas

column_data =['A','B','C']
index_data = ['a','b']
data = [[1,2,3],[4,5,6]]
df = pandas.DataFrame(data,index_data,column_data)
# 通过df.values.T使得二维矩阵转置。columns 和 index 互换索引,若columns 和 index 为 None,则默认索引 df = pandas.DataFrame(df.values.T,columns=index_data,index=column_data)

 

19、替换 dataframe 字符串

# 将表格中'ab'字符串替换成'xy',注意只能替换整个字符串。像'abc'不能替换
df = df.replace('ab','xy')

# 部分字符串替换:某列中将'ab'替换成'xy',如'abc'替换成'xyc'
df['xiaomi'] = df['xiaomi'].str.replac('ab','xy')

 

20、字符串格式读取 csv 文件内容

import pandas as pd

path = 'D:\test.csv'
df = pd.read_csv(path,dtype=object)

# 读取csv表格指定列,使用 usecols 参数
# df = pd.read_csv(path,dtype=object,usecols=[0,1,2,5])

 

21、datacompy 比较两个 datafram 表格之间区别

import datacompy

compare = datacompy.Compare(df_csv1, df_csv2,on_index=True)
# 最后判断是否相等,返回 bool
print(compare.matches())  
# 打印报告详情,行和列之间元素不相同均会被打印出来,返回 string
print(compare.report())

 

22、两列加减乘除

#加
df['plus']=df['xiaomi']+df['huawei']
#减
df['plus']=df['xiaomi']-df['huawei']
#乘
df['plus']=df['xiaomi']*df['huawei']
#除
df['plus']=df['xiaomi']/df['huawei']

 

23、两张表格链接操作merge(合并数据)

类似于mysql的连表查询

# 对df1和df2表格进行合并操作merge。
# on:用于链接的列名。同时存在于左右两个表中的列名。
# left_on:左表用于链接的列
# left_on:右表用于链接的列
df=pandas.merge(df1,df2,how='inner',on='name')
df=pandas.merge(df1,df2,how='left',left_on='name',right_on='name')
df=pandas.merge(df1,df2,how='right',on='name')
df=pandas.merge(df1,df2,how='outer',left_on='name',right_on='name')

 

24、表格合并concat

类似_append()方法添加数据的格式

# 将多个表合并在一起。axis=0:从行方向上进行添加数据。axis=1:从列方向上进行添加数据。ignore_index = True,创建新的索引,不保留原来的索引
df = pandas.concat([df1,df2,df3],axis=0,ignore_index = True)

 

25、表格内容模糊搜索

# pat: 字符串或正则表达式,用于查找的模式。
# case: bool类型,默认是True,表示是否区分大小写。
# flags: 用于re.compile()编译正则表达式的标志。
# na: 用于替换缺失值的表示。
# regex: 默认是True,表示字符串是否用正则表达式来匹配。
df = df[df['颜色'].str.contains(pat, case=True, flags=0, na=None, regex=True)]

 

posted @ 2021-09-17 17:30  三只松鼠  阅读(2090)  评论(0编辑  收藏  举报