zoukankan      html  css  js  c++  java
  • pandas使用

    一、pd.cut()与pd.qcut()的区别

     假设有一组人员数据,而你希望将它们划分为不同的年龄组

    ages = [18,20,22,25,27,21,23,37,31,61,45,32]
    bins = [18,25,35,60,100]
    cats = pd.cut(ages, bins)#将ages中的每个元素划分到bins组内
    cats
    '''
    [NaN, (18, 25], (18, 25], (18, 25], (25, 35], ..., (35, 60], (25, 35], (60, 100], (35, 60], (25, 35]]
    Length: 12
    Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]]
    四个分组采取左开右闭方式,不存在于某区间内,则为NaN
    '''
    #添加分组标签
    group_names = ['Youth', 'YoungAdult', 'MiddleAged', 'Senior']
    cats = pd.cut(ages, bins, labels=group_names)
    '''
    [NaN, Youth, Youth, Youth, YoungAdult, ..., MiddleAged, YoungAdult, Senior, MiddleAged, YoungAdult]
    Length: 12
    Categories (4, object): [Youth < YoungAdult < MiddleAged < Senior]
    '''
    
    '''
    qcut是类似cut的函数,但是qcut是使用的样本分位数,所以得到大小基本相等的面元。即每个面元,每个分组的数据数量基本相同。 pd.qcut(data,4) 即将数据data均匀撒在四个分组中
    '''
    data = [x for x in range(20)]
    pd.qcut(data, 4,labels=[0,1,2,3])
    '''
    [0, 0, 0, 0, 0, ..., 3, 3, 3, 3, 3]
    Length: 20
    Categories (4, int64): [0 < 1 < 2 < 3]
    '''
    

    二、当数据列中存在NA值时,想对这些NA值进行填充

    import pandas as pd
    import numpy as np
    
    train_file = "train.csv"
    test_file = "test.csv"
    test_result_file = "gender_submission.csv"
    
    train = pd.read_csv(train_file)
    test = pd.read_csv(test_file)
    test_y = pd.read_csv(test_result_file)#test也有标签,用于核对模型对test数据预测的结果好坏
    
    full_data = [train,test]
    print(train.info())
    
    #比如有一数据列Age,存在NA值,使用的填充值的范围[(mean - std) ,(mean + std)]
    for dataset in full_data:
        age_avg = dataset['Age'].mean()
        age_std = dataset['Age'].std()
        
        age_null_count = dataset['Age'].isnull().sum()
        age_default_list = np.random.randint(low=age_avg-age_std,high=age_avg+age_std,size=age_null_count,)
        
        dataset['Age'][np.isnan(dataset['Age'])] = age_default_list
        dataset['Age'] = dataset['Age'].astype(int)
    

    三、如何更改pandas DataFram的列名

     有两种方法:df.columns和df.renames

    import pandas as pd
    df = pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})
    print(df)
    '''
       a  b
    0  1  4
    1  2  5
    2  3  6
    '''
    
    #一、修改列名a,b为A、B
    df.columns = ['A','B']
    print(df)
    '''
       A  B
    0  1  4
    1  2  5
    2  3  6
    '''
    #二、只修改列名A为a
    df.rename(columns={'A':'a'})
    '''
       a  B
    0  1  4
    1  2  5
    2  3  6
    '''

    四、pandas中pd.loc和pd.iloc及pd.ix的区别

    import pandas as pd
    data = [[1,2,3],[4,5,6]]
    index = ['A','B']
    columns=['a','b','c']
    df = pd.DataFrame(data=data, index=index, columns=columns)
    '''
       a  b  c
    A  1  2  3
    B  4  5  6
    '''
    
    #loc——通过行标签索引行数据
    df.loc['A']
    '''
    a    1
    b    2
    c    3
    Name: A, dtype: int64
    '''
    
    df.loc['B']
    '''
    a    4
    b    5
    c    6
    Name: B, dtype: int64
    '''
    
    #iloc——通过行号获取行数据 
    df.iloc[0]
    '''
    a    1
    b    2
    c    3
    Name: A, dtype: int64
    '''
    
    df.iloc[1]
    '''
    a    4
    b    5
    c    6
    Name: B, dtype: int64
    '''
    
    #ix——结合前两种的混合索引
    df.ix['A']
    '''
    a    1
    b    2
    c    3
    Name: A, dtype: int64
    '''
    
    df.ix[0]
    '''
    a    1
    b    2
    c    3
    Name: A, dtype: int64
    '''
    

    五、pandas如何去掉数据集某列或者某行

     pd.drop(),要注意如果想直接作用到原对象上,可传入参数inplace=True,即:pd.drop(inplace=True)

    df = pd.DataFrame(np.arange(12).reshape(3,4), columns=['A','B','C','D'])
    df
    '''
       A  B   C   D
    0  0  1   2   3
    1  4  5   6   7
    2  8  9  10  11
    '''
    
    df.drop(['B','C'],axis=1)
    '''
       A   D
    0  0   3
    1  4   7
    2  8  11
    '''
    
    #去掉某行
    df.drop([0,1])
    '''
       A  B   C   D
    2  8  9  10  11
    '''
    
    #传入参数inplace=True,直接作用于原对象
    df.drop([1,2],inplace=True)
    df
    '''
       A  B  C  D
    0  0  1  2  3
    '''
    

    六、pd.Series()使用

     Series是一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据标签(即索引)组成

    Se = pd.Series([4, 7, -5, 3])
    Se
    '''
    0    4
    1    7
    2   -5
    3    3
    dtype: int64
    '''
    
    Se = pd.Series([4,7, -5, 3], index=['d', 'b', 'a', 'c'])
    Se
    '''
    d    4
    b    7
    a   -5
    c    3
    dtype: int64
    '''
    
    #取值
    Se['a']
    '''
    -5
    '''
    
    Se['b']
    '''
    7
    '''
    
    #元素为int时计算
    Se * 2
    '''
    d     8
    b    14
    a   -10
    c     6
    dtype: int64
    '''
    

    七、pd合并数据集

     pd.concat()用法

    s1 = pd.DataFrame([0,1], index=['a', 'b'])
    s2 = pd.DataFrame([2,3], index=['c', 'd'])
    s3 = pd.DataFrame([4,5], index=['e', 'f'])
    '''
    s1
       0
    a  0
    b  1
    
    s2
       0
    c  2
    d  3
    
    s3
       0
    e  4
    f  5
    '''
    #默认按照行合并
    pd.concat( [s1,s2,s3] )
    '''
       0
    a  0
    b  1
    c  2
    d  3
    e  4
    f  5
    '''
    
    #axis=1,按照列合并,如果索引不同,用NAN填充
    pd.concat([s1,s2,s3],axis=1)
    '''
         0    0    0
    a  0.0  NaN  NaN
    b  1.0  NaN  NaN
    c  NaN  2.0  NaN
    d  NaN  3.0  NaN
    e  NaN  NaN  4.0
    f  NaN  NaN  5.0
    '''
    #axis=1,按照列合并,如果索引相同,s1和s2,s3索引都是a,b
    pd.concat([s1,s2,s3],axis=1)
    '''
       0  0  0
    a  0  2  4
    b  1  3  5
    '''
    

     

    八、利用pd进行数据筛选

    #筛选出多列
    train[ ['FamilySize','IsAlone'] ]
    
    #按照列的条件进行筛选
    train['IsAlone'][train['FamilySize']==1] = 1#将FamilySize域为1的IsAlone域赋值为1
    

      

    九、关于low_memory=False

    import pandas as pd
    data = pd.read_csv('银行产品推荐数据.csv')
    '''
    Warning (from warnings module):
      File "Bank.py", line 1
        import pandas as pd
    DtypeWarning: Columns (11) have mixed types. Specify dtype option on import or set low_memory=False.
    '''
    
    #有时出现上面的错误,改正方法
    #方法一
    data = pd.read_csv('银行产品推荐数据.csv', low_memory=False)
    
    #方法二,优于方法一
    data = pd.read_csv( '银行产品推荐数据.csv', dtype={ "Is Employee's Spouse":str } )
    

     pandas读取csv文件默认是按块读取的,即不一次性全部读取;

     另外pandas对数据的类型是完全靠猜的,所以pandas每读取一块数据就对csv字段的数据类型进行猜一次,所以有可能pandas在读取不同块时对同一字段的数据类型猜测结果不一致

     low_memory=False 参数设置后,pandas会一次性读取csv中的所有数据,然后对字段的数据类型进行唯一的一次猜测。这样就不会导致同一字段的Mixed types问题了。

     但是这种方式真的非常不好,一旦csv文件过大,就会内存溢出;所以推荐用方法二

    十、value_counts转换为字典:to_dict()

    dataframe[field].astype(int).value_counts().to_dict()
    

    十一、筛选满足条件的行

    df[df['column name'].map(len) < 2]
    # df为整个数据框
    
  • 相关阅读:
    (转)tomcat 安全配置文档
    (转)nginx 安全配置文档
    (转)scipy详解
    (转)matplotlib实战
    (转)Python3的四舍五入round()函数坑爹?不,更科学!
    (转)p解决 java.util.prefs.BackingStoreException 报错问题
    (转)asyncio --- 异步 I/O
    (转)pycharm快捷键、常用设置、配置管理
    (转)db2top详解
    (转)Db2 数据库常见堵塞问题分析和处理
  • 原文地址:https://www.cnblogs.com/always-fight/p/9209030.html
Copyright © 2011-2022 走看看