pandas 数据分析常用技巧

  最近在做一些真实实验数据的处理,用到了pandas库,也着着实实感受到了pandas的魅力,这篇博客做个总结以及扩展。

  Pandas基于两种数据类型:series与dataframe。series是一个一维的数据类型,其中每一个元素都有一个标签,标签可以是数字或者字符串;一个dataframe是一个二维的表结构,Pandas的dataframe可以存储许多种不同的数据类型,并且每一个坐标轴都有自己的标签。你可以把它想象成一个series的字典项.

  • 数据读取以及基本预处理
# 以下是一些比较常规的起始处理

import pandas as pd
data_path = './data.xls'
df = pd.read_excel(data_path, sheet_name=0, header=0) # 注意如果表中没有header,则header=None

# 正则表达式用于修改列名
regex = re.compile(pattern='[\u4e00-\u9fa5|a-zA-Z]{1,}[(]?[\u4e00-\u9fa5]?[)]?')
column_names = [regex.search(i).group() for i in df.columns.values.tolist()]
df.columns = column_names

# 数据类型转换
df[column_names[1:]] = df[column_names[1:]].apply(pd.to_numeric)

# 设置其中某一列为index列,并转换类型
df.set_index(['列名'], inplace=True)
df.index = df.index.astype(str)

df.sort_index(ascending=False)
df.reset_index(drop=True)  # 使index列从0开始排列

df.to_csv('path')
# 或则 df.to_excel()
# 或则 df.to_dict()
  • 实用方法
    pd.options.display.float_format = '{:, .3f}'.format
    
    df.head(n)  # 查看前n个记录
    df.tail(n)  # 查看后n个记录
    
    df.describe()  # 包含多种统计信息,如均值,方差等
    len(df)  # 记录的条数
    
    df.sum(axis=1)  # 统计函数
    df.mean(axis=0)
    df.max()
    df.min()
    df.std()
    
    # 重新给记录排列顺序,即打乱数据
    df.sample(frac=1).reset_index(drop=True)
    
  • 获取DataFrame行数据
    import pandas as pd
    data=[[1,2,3],[4,5,6]]
    index=['a','b']#行号
    columns=['c','d','e']#列号
    df=pd.DataFrame(data,index=index,columns=columns)
    

loc——通过行标签索引行数据

df.loc['a']  # 返回index值为 'a' 的一行, 

iloc——通过行号索引行数据

df.iloc[0]  # 
df.iloc[0].values  # 
df.iloc[0].values.tolist()  # class list

ix——通过行标签或者行号索引行数据(基于loc和iloc 的混合)

df.ix[0] # 
df.ix['a'] # 
  • 获取DataFrame列数据
df.loc[:,'c':'d']

df.iloc[:,0:2]

df.ix[:,'c':'d']

df.ix[:,0:2]

# 需要注意的是结果都为
'''
   c  d
a  1  2
b  4  5
'''

df['列名']
df.列名
  • 数据归一化
df_norm = df.apply(lamda x: (x-np.mean(x))/(np.std(x)))  # 返回归一化数据
  • 过滤
# boolean masking 技术
# 筛选信息技术基础>85份, 基础化学小于93分的同学
df[(df['信息技术基础']>85) & (df['基础化学']<93)]

# 筛选某字段是以某子串开头的记录
df[ df['列名'].str.startswith('some-thing')]
  • apply、applymap、map

apply()是一种让函数作用于列或者行操作;

df.apply(func=lambda x: x.max()-x.min(), axis=1)  # 1表示行;0表示列

applymap()是一种让函数作用于DataFrame每一个元素的操作;

df.applymap(func=lambda x: x-1)  # 使每个元素都减1操作 

map是一种让函数作用于Series每一个元素的操作

df['列名'].map(lambda x: x-1) # 使某一列每个元素减1操作
  • 合并数据集
    df = pd.DataFrame(
            [
                [1, 2, 3, 4],
                [5, 6, 7, 8]
            ]
        )
    
        df2 = pd.DataFrame(
            [
                [1, 99, 98],
                [5, 69, 78]
    
            ]
        )
    
        # merge函数用于合并, on 可以指定数字(index)或列名
        df = df.merge(df2, on=[0])
    
        print(df)
        
        """
    	0  1_x  2_x  3  1_y  2_y
    0  1    2    3  4   99   98
    1  5    6    7  8   69   78
        """
    
  • 快速作图

    pandas这个简单的功能还是很给力的,可以用一用, pandas关于绘图还有不少其他方面,下次有机会我做个总结,这里简单一点,点到为止:

    df = pd.DataFrame(
            [
                [1, 2, 3],
                [3, 4, 6],
                [5, 6, 6],
                [7, 8, 8],
                [9, 10, 9]
            ],
            columns=['a', 'b', 'c'],
            index=[1, 2, 3, 4, 5]
        )
    
        # print(df)
        import matplotlib.pyplot as plt
        df.plot(x=0, y=[1, 2])
        plt.show()
    

pandas 数据分析常用技巧_第1张图片

  • 筛选

    import pandas as pd
    import numpy as np
     
    a=np.array([[1,2,3],[4,5,6],[7,8,9]])
    df1=pd.DataFrame(a,index=['row0','row1','row2'],columns=list('ABC'))
    df2=df1.copy()  # 重新开辟一个空间存储一份和df1一样的数据
    
    • 删除/选取某行含有特定数值的行

      df1[df1['A'].isin([1])]  # 选取df1中A列包含数字1的行
      df1[~df1['A'].isin([1])] #通过~取反,选取不包含数字1的行
      
    • 删除/选取某行含有特定数值的列

      cols=[x for i,x in enumerate(df2.columns) if df2.iat[0,i]==3]  # #利用enumerate对row0进行遍历,将含有数字3的列放入cols中
      df2[cols]   选取含有特定数值的列
      df2.drop(cols,axis=1) #利用drop方法将含有特定数值的列删除
      

你可能感兴趣的:(Python)