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('index的列名')  # 使index列的数据变回为数据的一部分

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' 的一行, <class 'pandas.core.series.Series'>

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

df.iloc[0]  # <class 'pandas.core.series.Series'>
df.iloc[0].values  # <class 'numpy.ndarray'>
df.iloc[0].values.tolist()  # class list

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

df.ix[0] # <class 'pandas.core.series.Series'>
df.ix['a'] # <class 'pandas.core.series.Series'>
  • 获取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()

    这里写图片描述

猜你喜欢

转载自blog.csdn.net/jeffery0207/article/details/81238722