• Pandas的DataFrame


    1. 手工创建DataFrame

    1 a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
    2 data = DataFrame(a)

     2. Excel数据数据没有顶头的处理

     1 import os
     2 import pandas as pd
     3 base_path = "D:\practicespace\Python\datasets"
     4 file_name = "data.xlsx"
     5 path = os.path.join(base_path, file_name)
     6 print(path)
     7 if(os.path.exists(path)):
     8     print("file exists")
     9 
    10 data = pd.read_excel(path, sheet_name="Sheet4", header=2, usecols="C:J")
    11 data.head()

    3. 字段值统计

     data.Region.value_counts() 

    output:

    EOC    36675

    SOC    28468

    WOC    20460

    NOC    16017

    Name: Region, dtype: int64

    4.字段包含特殊符号(比如空格)的索引方式

    不能再采用".字段名“的方式,而是要采用字符索引方式:

    1 print("region count: ", len(data.Region.value_counts()))
    2 print("Sub Region count: ", len(data["Sub Region"].value_counts()))

    或者去掉特殊,然后再进行字段直接索引

    df = df.rename(columns=lambda x: x.replace("'","").replace('"','')).replace(" ","")

    5. 缺失值处理

    1)统计缺失值

    1 total = data.isnull().sum().sort_values(ascending=True)
    2 percent = (data.isnull().sum()/data.isnull().count()).sort_values(ascending=True)
    3 table = pd.concat([total, percent], axis=1, keys=["total", "percent"])

    2)删除缺失值的行列

    1 # 使用dropna方法删除含有缺失值的行,默认是行
    2 print(data.dropna())
    3 # 删除含有缺失值的列
    4 print(data.dropna(axis=1))

    3)填充缺失值

     1 from pandas import DataFrame
     2 a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
     3 data = DataFrame(a)
     4 print(data)
     5 # 统一填充缺失值为指定值
     6 print(data.fillna(0))
     7 # index=1(从0开始)列缺失值填充为1,index=2的列的缺失值填充为2
     8 print(data.fillna({1:1,2:2}))
     9 # 使用平均值进行填充
    10 print(data.fillna(data.mean()))
    11 # 前向填充,使用默认是上一行的值,设置axis=1可以使用列进行填充,不存在或者上一行也是None的时候就不填充
    12 print(data.fillna(method="ffill"))
    13 print()
    14 # 后向填充,使用下一行的值,不存在或者下一行也是None的时候就不填充
    15 print(data.fillna(method="bfill"))

    6.遍历数据运算

     1 # 最原始,效率最低的迭代方案
     2 def myfunction(df):
     3     res_list = []
     4     for i in range(0,len(df)):
     5         res_list.append(df.iloc[i]['first']/df.iloc[i][‘second'])
     6     return disftance_list
     7 # 通过iterrows做遍历
     8 def haversine_looping(df):
     9     disftance_list = []
    10     for index,row in df.iterrows():
    11         disftance_list.append(row[‘high']/row[‘open'])
    12     return disftance_list
    13 # Cython做了全局优化,效率比iterrow有所提高,这里注意axis必须要设置
    14 df.apply(lambda row: row[‘high']/row[‘open'], axis =1)
    15 # pandas的矢量化处理,比较快,做了底层实现优化
    16 dftest4['rate'] = dftest4['high']/dftest4['open']
    17 # 通过values将pandas的serias数据转化为numpy arrays,效率最高,因为numpy在底层做了C的预编译
    18 dftest5['rate'] = dftest5['high'].values/dftest5['open'].values

    7. 列内容重置

    1 df1['total'] = df1.Jan + df1.Feb + df1.Mar
    2 df1['category'] = np.where(df1['total'] > 200000, 'A', 'B')

    这里注意,如果是total已经存在,可以通过df1.total的索引方式,但是如果是新创建的列,只能通过["columnName"]的方式进行索引。

    8. 删除列

    1 del DF['column-name']
    2 DF= DF.drop('column_name', 1);
    3 DF.drop('column_name',axis=1, inplace=True)
    4 DF.drop([DF.columns[[0,1, 3]]], axis=1,inplace=True)   # Note: zero indexed

    9. group

    在pandas里面的group,分组和运算是分开的,对于聚合则是在group之后通过调用sum,mean之类的函数基于分组做运算;

    1 # 单分组
    2 groupall = data.groupby("Region")
    3 groupall = groupall.sum()
    4 groupall
    5 # 多分组
    6 groupall = data.groupby(["Region", "Sub Region"])
    7 groupall = groupall.sum()
    8 groupall

    10. reindex vs. reset_index

    reindex是进行列重排,需要指定要保留那些列(也可以指定新列),

    1 df = pd.DataFrame(np.arange(9).reshape(3,3), index=[2,3,1], columns=['a','b','c'])
    2 df
    3 df1=df.reindex(columns=['a','b'])
    4 df1
      df2=df.reindex(columns=['a','b','e'])
      df2

    df返回为:

       a b c
    2 0 1 2
    3 3 4 5
    1 6 7 8

    df1返回为(看到c列已经消失了):

     a b
    2 0 1
    3 3 4
    1 6 7

    df2返回为:

     a b e
    2 0 1 NaN
    3 3 4 NaN
    1 6 7 NaN

    reset_index则是重新创建一个索引列,一般group之后索引列就消失了,所以需要通过reset_index重新插入一列索引,默认不改变数据,只是插入一列索引列,可以通过指定drop参数来对原索引列进行删除(group之类的聚合操作已经没有原索引列信息了)。

    >>> df = pd.DataFrame(np.arange(9).reshape(3,3), index=[2,3,1], columns=['a','b','c'])
    >>> df

    >>> df2 =df.reset_index()
    >>> df2

    >>> df3 = df.reset_index(drop=True) #删除原索引列
    >>> df3

    >> 输出的df为:

       a b c
    2 0 1 2
    3 3 4 5
    1 6 7 8

    >> 输出的df2为:

      index  a b c
    0 2    0 1 2
    1 3    3 4 5
    2 1    6 7 8

    >> 输出的df3为:

     a b c
    0 0 1 2
    1 3 4 5
    2 6 7 8

    参考:

    https://www.jianshu.com/p/e664b9a3bf70

    https://blog.csdn.net/katyusha1/article/details/81501893

    缺失值处理

    https://blog.csdn.net/sinat_29957455/article/details/79017363

    迭代处理

    https://blog.csdn.net/m0_37382341/article/details/83716988

  • 相关阅读:
     sublime text3快速生成html头部信息(转)
    电脑同时安装Python2和Python3以及virtualenvwrapper(转)
    在windows下使用多版本Python安装相应的虚拟开发环境
    win10+wget 收藏
    关于OS_PRIO_SELF的说明
    select菜单实现二级联动
    HeadFirst设计模式笔记:(六)命令模式 —— 封装调用
    rnqoj-57-找啊找啊找GF-二维背包
    UILable:显示多种颜色的方法
    动态规划晋级——POJ 3254 Corn Fields【状压DP】
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/11434462.html
Copyright © 2020-2023  润新知