Advertisement

数据挖掘算法和实践(二十六):DataFrame的常用方法温故

阅读量:

最近在学习使用Pandas进行数据分析时遇到了一些疑惑和问题,主要集中在以下几个方面:如何高效地导入和导出DataFrame格式的数据;如何将不同类型的Python数据(如list、字典等)转换为DataFrame;如何利用DataFrame的索引来进行切片和定位;如何对DataFrame应用自定义函数(如apply和lambda函数)进行数据处理;如何对数据进行排序和调整列的顺序;以及如何进行初级统计汇总(如求均值、总和等)。此外,在处理缺失值时也遇到了一些挑战,并学习了如何使用fillna方法填补缺失值以及如何利用groupby方法对数据进行分组聚合操作。通过这些实践逐步掌握了Pandas的核心功能,并对后续的数据分析工作充满信心。

在开发一个分类模型的过程中发现对dataframe的操作尚有不足之处。
为了更好地梳理思路与解决问题,特意整理了本次实践中的疑虑与困惑。

数据的导入和写出

复制代码
    # 数据的导入和写出,pandas包可以读取excel、csv、json等文件格式
    data1=pd.read_excel(baseUrl+"data1.xlsx")
    
    # 相应地,pandas结构化的数据也可以写出本地的任意格式
    submission = pd.DataFrame({
        "dddd": y["dddd"],
        "tttt": y['tttt'].apply(lambda x:1 if x>0.5 else 0)
    })  
    submission.to_csv('result.csv', index=False)

其他数据类型转DataFrame

复制代码
    # 从python的list创建
    a=[[1,2,3],[2,3,4],[3,4,5]]
    dfa=pd.DataFrame(a,columns=['a','b','c'])
    
    # 字典创建
    data = {
    'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
    'year':[2000,2001,2002,2001,2002],
    'pop':[1.5,1.7,3.6,2.4,2.9]
    }
    frame = pd.DataFrame(data)
    
    # np创建
    s=(3,4)
    frame = pd.DataFrame(np.zeros(s))
    df = pd.DataFrame(np.random.randn(3,4))
    
    # 强制类型转换
    a = [['a', '1.2', '4.2'], ['b', '70', '0.03'], ['x', '5', '0']]
    df = pd.DataFrame(a, columns=['one', 'two', 'three'])
    df[['two', 'three']] = df[['two', 'three']].astype(float)
    df.dtypes
    
    # 算术运算
    df1 = pd.DataFrame(np.arange(9).reshape((3,3)),columns=list('bcd'),index=['Ohio','Texas','Colorado'])
    df2 = pd.DataFrame(np.arange(12).reshape((4,3)),columns = list('bde'),index=['Utah','Ohio','Texas','Oregon'])
    df1 + df2

索引和切片

复制代码
    # 索引和切片,loc和iloc的区别在于后者是范围切片,前者是用idex+column组合切片,ix则都可以,三者都是先行后列
    print data.columns #列索引名称
    print data.index #行索引名称
    print data.ix[1] #取第2行数据
    print data.iloc[1] #取第2行数据
    print data['x'] #取列索引为x的一列数据
    print data.loc['A'] #取行索引为”A“的一行数据,
    print data.loc[:,['a','b'] ] #表示选取所有的行以及columns为a,b的列;
    print data.loc[['A','B'],['x','z']] #表示选取'A'和'B'这两行以及columns为x,z的列的并集;
    print data.iloc[1:3,1:3] #数据切片操作,切连续的数据块
    print data.iloc[[0,2],[1,2]] #即可以自由选取行位置,和列位置对应的数据,切零散的数据块
    print data[data>2] #表示选取数据集中大于0的数据
    print data[data.x>5] #表示选取数据集中x这一列大于5的所有的行
    print a1[a1['y'].isin(['6','10'])] #表显示满足条件:列y中的值包含'6','8'的所有行。
    print data.mean() #默认对每一列的数据求平均值;若加上参数a.mean(1)则对每一行求平均值;
    print data['x'].value_counts() #统计某一列x中各个值出现的次数:
    print data.describe() #对每一列数据进行统计,包括计数,均值,std,各个分位数等。

应用该方法时会调用[lambda]()函数

复制代码
    # DataFrame中map、apply、applymap
    # 三者都可以使用自定义函数或者lambda表达式,区别在于map是py自带,apply是适用某一行或者列,applymap适用整个df
    a=[[1,2,3],[2,3,4],[3,4,5]]
    df1=pd.DataFrame(a,columns=['a','b','c'])
    df1['d']=df1['c'].apply(lambda x:x-1)
    df1['e']=df1['c'].map(lambda x:x-1)
    df2=df1.applymap(lambda x:x-1)
    print('df1:',df1)
    print('df2:',df2)

排序和调整顺序

复制代码
    # 排序及调整列的顺序
    a=[[6,12,3],[8,4,1],[7,4,5]]
    df1=pd.DataFrame(a,columns=['a','b','c'])
    
    #按照任意一列或多列进行排序
    df2=df1.sort_values(by=['a'])

初级汇总

复制代码
    # 初级统计汇总
    a=[[6,12,3],[8,4,1],[7,4,5]]
    df1=pd.DataFrame(a,columns=['a','b','c'])
    df1.sum(axis=1)# 列汇总
    df1.sum() #行汇总
    df1.mean() # 行平均
    df1.mean(axis=1,skipna=False) # 列平均
    df1.describe() # 列统计分析

空值填充

复制代码
    # 空值填充Pandas中缺失值相关的方法主要有以下三个:
    #isnull和isna方法用于判断数据是否为空数据,因为对R语言的模仿,两者无差异,np用的是isnan()
    #fillna方法用于填补缺失数据;fillna识别的空值是NaN和None,但不包括空字符串
    #dropna方法用于舍弃缺失数据。
    a=[['','w','c'],['b','k','m'],['ss','s','v']]
    df1=pd.DataFrame(a,columns=['a','b','c'])
    df1['a'].isnull() #等价 df1['a'].isna()
    # 可以将空格和空值转成NaN后再处理
    df1['a']=df1['a'].apply(lambda x: np.NaN if str(x).isspace() or str(x)=='' else x)
    df1.isnull()
    df1.fillna('fuck')
在这里插入图片描述

groupby的使用

复制代码
    # groupby的使用
    df = pd.DataFrame({'Gender' : ['男', '女', '男', '男', '男', '男', '女', '女', '女'],
          'name' : ['周杰伦', '蔡依林', '林俊杰', '周杰伦', '林俊杰', '周杰伦', '田馥甄', '蔡依林', '田馥甄'],
          'income' : [4.5, 2.9, 3.8, 3.7, 4.0, 4.1, 1.9, 4.1, 3.2],
         'expenditure' : [1.5, 1.9, 2.8, 1.7, 4.1, 2.5, 1.1, 3.4, 1.2]
         })
    #根据其中一列分组,as_index=False 解决视图问题
    mean1 = df.groupby(['Gender'], as_index=False).mean()
    #根据其中两列分组
    mean2 = df.groupby(['Gender', 'name'], as_index=False).mean()
    #只对其中一列求均值
    mean3 = df.groupby(['Gender', 'name'], as_index=False)['income'].mean()
    # df_index = df.reset_index() 
    mean1,mean2,mean3
    
    #size跟count的区别: size计数时包含NaN值,而count不包含NaN值
    size = df.groupby(['Gender'], as_index=False).size()
    count = df.groupby(['Gender', 'name'], as_index=False).count()
    
    data_group = df.groupby(by=['Gender'])
    data_group['name'].count() # 等价于mean2 = df.groupby(['Gender'], as_index=False).count()
    
    #groupby+agg 可以对groupby的结果同时应用多个函数
    df.groupby(['Gender', 'name'], as_index=False).agg(['min','max'])
在这里插入图片描述

OneHot处理

复制代码
    # 数据的onehot处理
    dummies_1  = pd.get_dummies(df['name'])
    dummies_1.columns = ['tfz','cyl','zjl','ljj']
    #df = df.join(dummies_1)

全部评论 (0)

还没有任何评论哟~