reeber

引入

 import pandas as pd

《《------------------------------------------------------------------------------------------------------》》

使用

Pandas 数据结构:一维数据结构   

创建字典格式 :  pd.Series({“今日销售量” : 10086,“今日成交金额”:“1000084”},time=‘2018.8.21’)    

创建数组格式 : pd.Series([10086,1000084],index=[\'今日销售量\',\'今日成交金额\'],time=\'2018.8.21\')

 

 《《------------------------------------------------------------------------------------------------------》》

 

Dataframe :二维数据结构  是一个表格形的数据结构   ,“带标签的二维数组” ,带有(index) and (列标签)

使用 

data = {\'name\':[\'Jake\',\'Jeek\',\'Anmi\'],\'age\':[22,15,32],\'time\':[\'2019.2.1\',\'2019.3.1\',\'2019.4.2\']}

pd.DataFrame(data)   形成一个表格数据

创建的三种方法   :其他方法都不通用

1.data = {\'name\':[\'a\',\'b\',\'c\'],\'age\':[22,15,32],\'time\':[\'2019.2.1\',\'2019.3.1\',\'2019.4.2\']}

2. 第二种  设置两个一维数组  Series的方式

      data={\'one\':pd.Series(np.random.rand(2)),\'two\':pd.Series(np.random.rand(3))}    不设置index的

      data={\'one\':pd.Series(np.random.rand(2)),\'two\':pd.Series(np.random.rand(3)),index=[\'a\',\'b\',\'c\']}    设置 index的

3.   第三种  通过二维数组,指定index 和 colums

arr=np.arange(9).reshape(3,3)

      data = pd.DataFrame(arr)

      data = pd.DataFrame(data,index=[\'a\',\'b\',\'c\'],colums=[\'昨天\',‘今天’,‘明天’])

      print(data)    

 

重新指定cloums列名:  pd.DataFrame(data,colums=[\'H5\',\'Json\',\'Dic\'])  

出现问题:

?如果指定后,列名比数据多,那么该列下面的数据  显示 NaN  

?如果指定后,列名少于数据,只会显示对应的列数据 

《《------------------------------------------------------------------------------------------------------》》

Pandas 索引+切片     中筛选数据

Series和Datafram索引的原理一样,我们以Dataframe的索引为主来学习

  • 列索引:df[\'列名\'] (Series不存在列索引)
  • 行索引:df.loc[]、df.iloc[]

选择列 / 选择行 / 切片 / 布尔判断

     data[\'one\',\'abc\']      通过columns 选

     data.loc[\'a\',\'b\',\'c\',\'d\',\'e\']   通过行   选       这个里面切片是包含最后一个的

     data.iloc[:3]            通过切片 用数字表示,3之前的行  不包含3

     data[data>50]     数据大于50的值

     data[data[\'a\'] > 50]    a列  》 50   行数据

    ?选择出来后 按照 顺序放入 序列

     data[data > 5].index().tolist()   转为数组 按照顺序 

《《------------------------------------------------------------------------------------------------------》》

Pandas 基本技巧 

df.head()   默认前5条数据,也可以在括号内指定数字       

df.tail()    默认后5条数据

df.T()    转置    index  互换  columns | 列变行,行变列

添加和修改   删除数据行

   (添加操作)

       这个二维数据表格  index 只有 5,那么就把  index[6]  赋值

   (修改操作)

       df[\'a\']  = 200   df[\'a\'][0] = 333  

   (删除操作)

     del df[\'a\']    删除 columns  【a】

     df.drop(0)  删除行  删除index  行 

两个数据对齐合并  相加

    就会 默认 对应行和列  对齐相加填充,如果没有的行和列,填充NaN 

DataFrame  数据排序  

      random4 = np.random.rand(3,3)*100
      print(random4)
           data4 = pd.DataFrame(random4,columns=[\'a\',\'b\',\'c\'])
           data5 = data4.sort_values([\'b\'],ascending = True) #升序     False #降序   
           data5

 DataFrame  索引排序

       data7.sort_index()   #升序

       data7.sort_index(inplace=True) #数据更新改变  

《《------------------------------------------------------------------------------------------------------》》

DataFrame  数据计算和统计基础

   # np.nan :空值
   # .mean()计算均值

            m2 = df.mean(axis=1)    1=行数值计算结果    0 = 列结果

              # axis参数:默认为0,以列来计算,axis=1,以行来计算,这里就按照行来汇总了
   # 只统计数字列   

               m3 = df.mean(skipna=False)

               # skipna参数:是否忽略NaN,默认True,如False,有NaN的列统计结果仍未NaN
   # 可以通过索引单独统计一列

# 主要数学计算方法,可用于Series和DataFrame(1)

df = pd.DataFrame({\'key1\':np.arange(10),
                  \'key2\':np.random.rand(10)*10})
print(df)
print(\'-----\')

print(df.count(),\'→ count统计非Na值的数量\n\')
print(df.min(),\'→ min统计最小值\n\',df[\'key2\'].max(),\'→ max统计最大值\n\')
print(df.quantile(q=0.75),\'→ quantile统计分位数,参数q确定位置\n\')
print(df.sum(),\'→ sum求和\n\')
print(df.mean(),\'→ mean求平均值\n\')
print(df.median(),\'→ median求算数中位数,50%分位数\n\')
print(df.std(),\'\n\',df.var(),\'→ std,var分别求标准差,方差\n\')
print(df.skew(),\'→ skew样本的偏度\n\')
print(df.kurt(),\'→ kurt样本的峰度\n\')

# 主要数学计算方法,可用于Series和DataFrame(2)

    df[\'key1\'].cumsum()    单列的累计和 

    df[\'key1\'].cumprod()   单列累计积 

    print(df.cummax(),\'\n\',df.cummin(),\'→ cummax,cummin分别求累计最大值,累计最小值\n\')

 # 唯一值:.unique()

    解决问题:colums 中有重复的值,两个一样的列,那么取到唯一 个      重新整理成为一个DataFrame表格

## 值计数:.value_counts()

    解决问题: 得到该数据  出现的频率次数   a:2    b  3    生成一个新的 Series    括号内可写排序:sort = False   or  True

# 成员资格:.isin()

    解决问题: 一个DataFrame 显示数据,我就想知道 里面有没有我指定的一个 50    有就是对应位置显示 True,没有就是False

《《------------------------------------------------------------------------------------------------------》》

   pandas 文本数据处理

      一般处理 :

1.自动排除为np的值   NaN  

2.查看指定  文本数据字符的个数     .str.count()

3.修改大小写    .str.upper()   .str.lower() 

4.字符长度  .str.leng()  

5.开始字符是哪一个   .str.startwith(\'\')

6.结束字符是哪一个  .str.endwith(\'\')  

print(s.str.lower(),\'→ lower小写\n\')
print(s.str.upper(),\'→ upper大写\n\')
print(s.str.len(),\'→ len字符长度\n\')
print(s.str.startswith(\'b\'),\'→ 判断起始是否为a\n\')
print(s.str.endswith(\'3\'),\'→ 判断结束是否为3\n\')

df.columns.str.upper()   修改数据列

去空格
print(s.str.strip())  # 去除字符串中的空格
print(s.str.lstrip())  # 去除字符串中的左空格
print(s.str.rstrip())  # 去除字符串中的右空格

替换字符中的空格  

str.replace(\' \',\'\',n=1)     把空格替换为  空字符    

不写第三个参数 ,那么就是 全部替换 ,写了就是指定替换几个

 

# 字符串常用方法(4) - split、rsplit

print(s.str.split(\',\').str[0])
print(s.str.split(\',\').str.get(1))

# 可以使用get或[]符号访问拆分列表中的元素

# 可以使用expand可以轻松扩展此操作以返回DataFrame
# n参数限制分割数
# rsplit类似于split,反向工作,即从字符串的末尾到字符串的开头
print(s.str.split(\',\', expand=True))
print(s.str.split(\',\', expand=True, n = 1))
print(s.str.rsplit(\',\', expand=True, n = 1))

 

# 字符串索引

print(s.str[0])  # 取第一个字符串
print(s.str[:2])  # 取前两个字符串
print(df[\'key2\'].str[0])
# str之后和字符串本身索引方式相同

DataFrame 合并

     .merge(data1,data2,on=\'key\')   根据key列为索引合并,看下两个是否共有  一样的key ,有就保留

   @合并有有一个 分类 :  交集  和  并集      how=\'\' /inner、outer   、left、right

        交集:解释就是 原有的数据合并没有对应上,那么就会不要,只保留 共有的

        并集:解释就是  合并后不管你有没有,都会保留,只不过有的就是 保留原有数据,没有的 NaN 

   然后就是  设置参考键: on=‘’    设置根据on里面的值,两两对比,如果一样就合并   

   on是一个键,how=\'left\'    根据两个表,用第一个表         how=\'right\'   根据两个表 ,用第二个表 

   指定参考键:我想用左边的lkey列作为左边的参考键,  我想用右边表的index 作为  参考键   (两个数据表合并比较)

         (left_index   right_index  左边(设置True就行) left_on   right_on  这俩on(还是制定 index只不过分开指定,左表,右表说法) )     

代码展示

dataG = pd.DataFrame({\'key\':list(\'abcdedf\'),\'list\':range(7)});
dataW = pd.DataFrame({\'key\':list(\'abcdedf\'),\'list\':range(3,10)});
print(pd.merge(dataG,dataW,on=[\'list\'],how=\'outer\'))

how =\'outer\'  根据list为合并的条件,用了outer  没有达到要求的NaN补全

print(pd.merge(df1, df2, left_on=\'key\', right_index=True))

左边的指定键  为key,右边的表用 角标index 为键   合并比较

 数据连接

     两个DataFrame  连接,通过pd.concat([数组表1,数组表2]).sort_index()    角标顺序排列连接  

     两个DataFrame  连接,通过  pd.concat([数组表1,数组表2]),axis=1   列+列 成为一个DataFrame ,空的位置 用 NaN补全

inplace  

     两个Series   pd.reset_index(inplace=True).drop = True      

    一个Series一维,重置了他的index值,0 1 2 3 4 5 6   然后吧替换之前的index 设置为一个列,drop 设置True 就是问你是否删除这个之前的;列

去重

    按照 s.duplicate()     就会出现一个  True  False 的列表 ,  打印出  s[s.s.duplicate()    == False]   False  就代表不重复的值 

replace

      replace(\'a\',\'w\')   replace([\'a\',\'b\'],50)    都可以进行一个替换  

 

 DataFrame 数据分组(简称列分组)

       根据数据列columns名字,分组,并计算处理,得出数据   求和、平均值、长度、常用的一些列计算   

        简单解释语句:

               df.groupby(\'A\')    通过A列,里面的数据 只要不一样就会成组,  分成一个组然后 计算 

               df.groupby([\'A\',\'B\']).mean()    通过A/B两列,里面的数据,只要A 和 B两个组成不同的配对,就可以成组,计算

               df.groupby([\'A\'])[\'D\'].mean()  # 以A分组,算D的平均值

       分组后 类型格式为  groupby类型, 经过处理后 得出 可迭代对象,可以是数组、元祖、字典    一一对应操作方法

              print(list(df.groupby(\'X\')), \'→ 可迭代对象,直接生成list\n\')
              print(list(df.groupby(\'X\'))[0], \'→ 以元祖形式显示\n\')
             for n,g in df.groupby(\'X\'):
                 print(n)
                 print(g)
             print(\'###\')     # n是组名,g是分组后的Dataframe

    # .get_group()提取分组后的组

              print(df.groupby([\'X\']).get_group(\'A\'),\'\n\')

    # .groups:将分组后的groups转为dict
    # 可以字典索引方法来查看groups里的元素

              grouped = df.groupby([\'X\'])
              print(grouped.groups)
              print(grouped.groups[\'A\'])  # 也可写:df.groupby(\'X\').groups[\'A\']

     # .size():查看分组后的长度

              grouped.size()

    # 按照两个列进行分组

     grouped = df.groupby([\'A\',\'B\']).groups
           print(df)
           print(grouped)
           print(grouped[(\'foo\', \'three\')])

# 分组计算函数方法

s = pd.Series([1, 2, 3, 10, 20, 30], index = [1, 2, 3, 1, 2, 3])
grouped = s.groupby(level=0)  # 唯一索引用.groupby(level=0),将同一个index的分为一组
print(grouped)
print(grouped.first(),\'→ first:非NaN的第一个值\n\')
print(grouped.last(),\'→ last:非NaN的最后一个值\n\')
print(grouped.sum(),\'→ sum:非NaN的和\n\')
print(grouped.mean(),\'→ mean:非NaN的平均值\n\')
print(grouped.median(),\'→ median:非NaN的算术中位数\n\')
print(grouped.count(),\'→ count:非NaN的值\n\')
print(grouped.min(),\'→ min、max:非NaN的最小值、最大值\n\')
print(grouped.std(),\'→ std,var:非NaN的标准差和方差\n\')
print(grouped.prod(),\'→ prod:非NaN的积\n\')

 

 DataFrame 读取分组

      import os       引入 修改默认引入路径
       os.chdir(\'c:/zzz/www\')

     导入普通文本文件类型

   

  pd.read_table(\'data1.txt\',delimiter=\',\',sep=False)     

 

     导入Excel数据表格  少量数据

   

dataexcel = pd.read_excel(\'地市级党委书记数据库(2000-10).xlsx\',sheet_name=\'中国人民共和国地市级党委书记数据库(2000-10)\',header=0)
       print(dataexcel.head())

 

     导入CSV大型数据表格

  

   datacsv = pd.read_csv(\'地市级党委书记数据库(2000-10).csv\',encoding = \'utf-8\')
      print(datacsv.head())

 

分类:

技术点:

相关文章: