zoukankan      html  css  js  c++  java
  • Pandas提升效率的十个技巧

    1、read_csv

     如果你要读取的数据量很大时,你可以尝试使用一下这个参数:chunksize=5。在实际加载整个数据表之前,只读取表的一小部分。

    2、select_dtypes

    在使用 Python 做数据预处理时,这个命令会帮你节省时间。在读取表后,每列的默认数据类型可以是 bool、int64、float64、object、category、timedelta64 或者datetime64。你可以先用该命令获取所有数据类型:

    df.dtypes.value_counts()

    然后执行以下操作,选择所需特征的子数据集。

    df.select_dtypes(include=[‘float64’, ‘int64’])

    3、copy

    这是一个非常重要的命令。如果你执行以下命令:

    import pandas as pd
    df1 = pd.DataFrame({ ‘a’:[0,0,0], ‘b’: [1,1,1]})
    df2 = df1
    df2[‘a’] = df2[‘a’] + 1
    df1.head()

    会发现 df1 发生了变化。这是因为 df2 = df1 不是复制 df1 并将其赋值给df2,而是设置一个指向 df1 的指针。所以 df2 的任何变化都会导致 df1的变化。要解决这个问题,可以使用下面的两种方法:

    df2 = df1.copy()   或者

    from copy import deepcopy
    df2 = deepcopy(df1)

    4、map

    这是实现简单数据的转换中一个很 cool 的方法。首先定义一个字典,其中' keys '是旧值,' values '是新值。

    level_map = {1: ‘high’, 2: ‘medium’, 3: ‘low’}
    df[‘c_level’] = df[‘c’].map(level_map)

    5、apply

    如果我们想通过输入其他一些列值来创建一个新列,那么 apply 函数会非常有用。

    def rule(x, y):
        if x == ‘high’ and y > 10:
             return 1
        else:
             return 0
    df = pd.DataFrame({ 'c1':[ 'high' ,'high', 'low', 'low'], 'c2': [0, 23, 17, 4]})
    df['new'] = df.apply(lambda x: rule(x['c1'], x['c2']), axis =  1)
    df.head()

    在上面的代码中,我们定义了一个(x,y)二输入变量的函数,并使用apply 函数将其应用于“c1”列和“c2”列。

    但问题是,apply 方法有时候太慢了。比如,你想计算两列“c1”和“c2”的最大值,可以这样做:

    df[‘maximum’] = df.apply(lambda x: max(x[‘c1’], x[‘c2’]), axis = 1)

    但是它比下面的这个命令慢得多:

    df[‘maximum’] = df[[‘c1’,’c2']].max(axis =1)

    注意:如果能用其他内置函数完成相同的程序,就尽量不要用 apply,因为内置函数通常更快。例如,想要将列' c '四舍五入为整数,可以使用 round(df[‘c’], 0),而不是 apply 函数。

    6、value counts

    这是一个统计查看值分布情况的命令。如果您想看一下“c”列中有多少不同的值,以及每个值出现的频率,可以这样做:

    df[‘c’].value_counts() 

    下面还给大家总结了一些有用的技巧:

    A.   normalize = True:此句用于检查频率而不是计数。

    B.   dropna = False:可以在统计中包含缺失值。

    C.   sort = False:统计信息按值排序而不是按计数排序。

    D.    df[‘c].value_counts().reset_index():将统计表转换为 panda 数据表再处理。

    7、缺失值统计

    在构建模型时,如果想要排除缺失值或有缺失值所属的行,可以使用.isnull() 和 .sum() 来处理。

    import pandas as pd
    import numpy as np
    df = pd.DataFrame({ ‘id’: [1,2,3], ‘c1’:[0,0,np.nan], ‘c2’: [np.nan,1,1]})
    df = df[[‘id’, ‘c1’, ‘c2’]]
    df[‘num_nulls’] = df[[‘c1’, ‘c2’]].isnull().sum(axis=1)
    df.head()

    8、选择具有特定 id 的行

    在SQL中,我们可以使用 SELECT * FROM … WHERE ID in (‘A001’, ‘C022’, …) 来获取具有特定 ID 的记录。在 Pandas 中你可以这么做:

    df_filter = df[‘ID’].isin([‘A001’,‘C022’,...])
    df[df_filter]

    9、分组:按照百分比

    给一个数值列,希望对该列中的值进行分组,比如前 5% 的值分为 组1,5% - 20% 的值分为 组2,20% -50% 的值分为 组3,剩余 50% 的值分为组4。当然 Pandas 有很多种方法,但在这里提供一种新方法,其运行速度会很快(因为没有使用 apply 函数):

    import numpy as np
    cut_points = [np.percentile(df[‘c’], i) for i in [50, 80, 95]]
    df[‘group’] = 1
    for i in range(3):
        df[‘group’] = df[‘group’] + (df[‘c’] < cut_points[i])
    # or <= cut_points[i]

    10、to_csv

    这是一个大家都会用到的通用的命令。不过我会再单独指出两个使用技巧,第一个是:

    print(df[:5].to_csv())

    此命令可以准确地打印出将要写入文件的前五行数据。

    另一个技巧是 float_format=‘%.0f’。

    用于处理整数值和空缺值混合在一起的情况。如果一列同时包含缺失值和整数值,那么写入的数据类型仍然是 float 而不是 int 型。在导出数据表时,可以通过添加 float_format=‘%.0f’ 将所有浮点数四舍五入为整数。如果希望所有列输出的都是整数,那么这个技巧也可以帮你摆脱烦人的 ‘.0’ 格式。

  • 相关阅读:
    多继承
    NavigationController的使用
    WebService概述
    IOS block 教程
    多测师肖老师__项目讲解(12.3)
    跨平台跨服务器跨网站SSO(单点登录)方案的DEMO
    使用SQL Server Profiler
    asp.net生成高质量缩略图通用函数(c#代码),支持多种生成方式
    SQL优化实例:从运行30分钟到运行只要30秒
    测试工具的选择和使用
  • 原文地址:https://www.cnblogs.com/wu-wu/p/12444462.html
Copyright © 2011-2022 走看看