美文网首页pythonPython-资料
Python数据分析 | 数据处理的一些方法和技巧

Python数据分析 | 数据处理的一些方法和技巧

作者: cathy1997 | 来源:发表于2019-12-21 19:16 被阅读0次

    1.用pandas的to_csv()写csv文件

    import os
    import pandas as pd
    
    dataframe = pd.DataFrame({'name_1':list_1,'name_2':list_2})
    if os.path.exists(filepath):
        dataframe.to_csv(filepath, header=0, mode='a', index=False, sep=',')
    else:
        dataframe.to_csv(filepath, mode='a', index=False, sep=',')
    
    
    @ sep=',' 分隔符,如果不写,默认是‘,’
    @ na_rep='NA' 缺失值保存为NA,如果不写,默认是空
    @ float_format='%.2f'
    @ columns=['name'] 保存索引列和name列
    @ header=0 不保留列名
    @ index=0 不保存行索引
    

    参考:pandas系列 read_csv 与 to_csv 方法各参数详解

    2.将pandas Series或index转换为Numpy数组

    to_numpy()
    Series.values
    .array

    3.字典(dict)按键(key)和值(value)排序

    • 字典按键排序:
    >>> dic = {'a':2, 'b':1}
    >>> d = sorted(dic.items(), key = lambda k: k[0])
    >>> print(d)
    [('a', 2), ('b', 1)]
    
    • 字典按值排序:
    >>> dic = {'a':2, 'b':1}
    >>> d = sorted(dic.items(), key = lambda k: k[1])
    >>> print(d)
    [('b', 1), ('a', 2)]
    

    4.将列表中的字符串转为数字

    numbers = [ int(x) for x in numbers ]
    

    5.将列表中的日期转为字符串

    #  输出时间戳对应的年月日信息
    test['日期'].apply(lambda x: print(x.year, x.month, x.day))
    # 将时间戳转换为字符串
    myString = test['日期'].apply(lambda x: x.strftime('%Y-%m-%d'))
    

    6.python list 和dict的查找效率比较

    import time
    
    query_lst = [-60000,-6000,-600,-60,-6,0,6,60,600,6000,60000]
    
    lst = []
    dic = {}
    
    for i in range(100000000):
        lst.append(i)
        dic[i] = 1 
    
    start = time.time()
    for v in query_lst:
        if v in lst:
            continue
    end1 = time.time()
    
    for v in query_lst:
        if v in dic:
            continue
    
    end2 = time.time()
    
    print "list search time : %f"%(end1-start)
    print "dict search time : %f"%(end2-end1)
    

    运行结果:
    list search time : 11.836798
    dict search time : 0.000007

    list的查找效率远远低于dict的效率,原因在于:python中list对象的存储结构采用的是线性表,因此其查询复杂度为O(n),而dict对象的存储结构采用的是散列表(hash表),其在最优情况下查询复杂度为O(1)。

    7.pandas对DataFrame行、列操作

    • loc():通过行索引中的具体值来取行数据
      利用loc()的时候,当index相同时,会将相同的Index全部提取出来。优点是:如果index是人名,数据框为所有人的数据,则可以将某个人的多条数据提取出来分析;
      缺点是:如果index不具有特定意义,而且重复,那么提取的数据需要进一步处理,可用.reset_index()函数重置index。
    # 取索引为'a'的行
    data.loc['a']
    
    # 取'A'列所有行,多取几列格式为 data.loc[:,['A','B']
    data.loc[:,['A']]
    
    # 提取index为'a','b',列名为'A','B'中的数据
    data.loc[['a','b'],['A','B']]
    
    # 取所有列的所有行
    data.loc[:,:]
    
    # 提取data数据(筛选条件: A列中数字为0所在的行数据)
    data.loc[data['A']==0]
    data[data['A'].isin([0])]
    data.loc[(data['A']==0)&(data['B']==2)] # 提取data数据(多个筛选条件)
    data[(data['A'].isin([0]))&(data['B'].isin([2]))] # isin函数
    
    # 取表中index是6的倍数的行
    df.loc[::6]
    
    • iloc():通过行号来取行数据
    # 取第一行数据
    data.iloc[0]
    
    # 取第0列所有行,多取几列格式为 data.iloc[:,[0,1]]
    data.iloc[:,[0]] 
    
    # 提取第0、1行,第0、1列中的数据
    data.iloc[[0,1],[0,1]]
    
    # 取所有列的所有行
    data.iloc[:,:]
    

    8.Pandas中DataFrame合并、连接操作

    • concat:沿着一条轴,将多个对象堆叠到一起,相当于数据库中的全连接(union all)。可以指定连接的方式(outer joininner join),也可以指定按照某个轴进行连接。
      与数据库不同的是,它不会去重,但是可以使用drop_duplicates方法达到去重的效果。
    # objs:需要连接的对象集合,一般是列表或字典;
    # axis:用于指定是行还是列,axis默认是0;
    # join:参数为‘outer’或‘inner’;
    # join_axes=[]:指定自定义的索引;
    # keys=[]:创建层次化索引;
    # ignore_index=True:重建索引
    
    pd.concat(objs=[df1,df2], axis=0, join='outer', join_axes=None, ignore_index=False, 
           keys=None, levels=None, names=None, verify_integrity=False, copy=True)
    

    当axis=0时,pd.concat([obj1, obj2])的效果与obj1.append(obj2)是相同的;当axis=1时,pd.concat([obj1, obj2], axis=1)的效果与pd.merge(obj1, obj2, left_index=True, right_index=True, how='outer')是相同的

    • merge:通过键拼接列
      类似于关系型数据库的连接方式,可以根据一个或多个键将不同的DatFrame连接起来。
      典型应用场景:针对同一个主键存在两张不同字段的表,根据主键整合到一张表里面。
    # left和right:两个不同的DataFrame;
    # how:连接方式,有inner、left、right、outer,默认为inner;
    # on:指的是用于连接的列索引名称,必须存在于左右两个DataFrame中,如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键;
    # left_on:左侧DataFrame中用于连接键的列名,这个参数左右列名不同但代表的含义相同时非常的有用;
    # right_on:右侧DataFrame中用于连接键的列名;
    # left_index:使用左侧DataFrame中的行索引作为连接键;
    # right_index:使用右侧DataFrame中的行索引作为连接键;
    # sort:默认为True,将合并的数据进行排序,设置为False可以提高性能;
    # suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x', '_y');
    # copy:默认为True,总是将数据复制到数据结构中,设置为False可以提高性能;
    # indicator:显示合并数据中数据的来源情况
    
    pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,  
          left_index=False, right_index=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False)
    
    • join:主要用于索引上的合并
    pd.join(self, other, on=None, how='left', lsuffix='', rsuffix='',sort=False)
    

    9.将两个array拼接起来

    arr = np.hstack((arr1,arr2))
    arr = np.c_[arr1 ,arr2]
    

    10.使用RandomForestClassifier查看不同特征的重要程度

    from sklearn.ensemble import RandomForestClassifier
    
    clf = RandomForestClassifier(n_estimators=200, criterion='entropy', max_depth=4)
    rf_clf = clf.fit(x, y)
    rf_clf.feature_importances_
    

    相关文章

      网友评论

        本文标题:Python数据分析 | 数据处理的一些方法和技巧

        本文链接:https://www.haomeiwen.com/subject/pnylnctx.html