• python——pandas进行数据处理——数据处理常用方法


    (1)读取文件

    df = pd.read_csv(r'C:UsersAdministratorDesktop网约20年9月分时段订单数.csv')
    
    "内部存在不同编码编码方式"
    f = open(r'G:出租车分月2020年出租20年4月.csv',encoding='gbk', errors='ignore')
    df = pd.read_csv(f)
    
    "循环读取文件"
    path = r"G:出租车分月2019年"
    for filename in os.listdir(path):
        f = open(os.path.join(path,filename), encoding='gb18030', errors='ignore')
        df = pd.read_csv(f)
    "读取txt文件"
    df = pd.read_table(r'D:数据罗师姐的数据20180103.txt',sep = ',',encoding = 'utf-8',header = None) #通过sep = ','设置分隔符 ,负责读取的数据只有一列

    (2)处理时间数据

    df['depTime'] = pd.to_datetime(df.depTime,format = '%d/%m/%Y %H:%M:%S')
    #此时时间可以进行加减算法
    
    "将时间转换为秒"
    df4['WorkTime'] = (df3-df2).dt.total_seconds()

    (3)数据统计分析

    df['driveMile'].sum()   #对一列数据的值进行求和
    df.min()
    df.max()
    df.mean()
    df.median()
    df.var()  #计算方差
    df.std()  #计算标准差
    df.cov()    #计算协方差
    df.argmin() #返回最小值所在的位置
    df.argmax() #返回最大值所在的位置 
    df.cumsum() #运算累计和
    df.cumprod  #运算累计积
    df.pct_change() #运算比率 后一个元素与前一个元素的比值

    (4)列数据处理

    'apply的应用--选取某列的某几个字符'
    df2 = df['身份证号码'].apply(lambda x:str(x)[6:10])
    
    '截取字符'
    df['途经城市'] = df['途经城市'].str.slice(0,4)
    
    'apply的应用--小数转换为百分数'
    df1 = df1.apply(lambda x:format(x,'.2%'))
    #应用apply后,此列数据变为字符串格式
    
    "提取某列不重复元素的个数"
    res = df['carNo'].unique()  #返回一个多维数组,ndarray类型
    
    "统计某列每个元素出现的次数"
    ser = df['carNo'].value_counts()    #返回一个Series序列,索引为元素名称,可通过 .index获取索引
    
    "统计dataframe数据的行数"
    res = df['carNo'].shape[0]
    
    "转换某一列的数据类型"
    res = df['carNo'].astype('int')
    
    '删除某一列重复元素'
    df.drop_duplicates(subset=['A','B'],keep='first',inplace=True)
    #subset为列名,keep:{'first,'last', False}, 默认值 'first':保留第一次出现的重复行,删除后面的重复行 ,last: 删除重复项,除了最后一次出现  False: 删除所有重复项。
    #inplace  替换原数据,默认为False 即原数据不变 生成一个新的数据

    (5)透视表操作

    'stack:将数据的列索引旋转为行索引'
    'unstack:将数据的行索引旋转为列索引'
    df = pd.DataFrame({'水果种类':['苹果','苹果','','','草莓','草莓'],
                   '信息':['价格','数量','价格','数量','价格','数量'],
                   '':[4,3,5,4,6,5]})
    '''  水果种类  信息  值
    0   苹果  价格  4
    1   苹果  数量  3
    2    梨  价格  5
    3    梨  数量  4
    4   草莓  价格  6
    5   草莓  数量  5'''
    stack_df = df.stack()   #运行后stack_df将有两个索引  原索引0 1 2 3 4 5 以及原行索引 水果种类  信息  值

    '''0 水果种类 苹果 信息 价格 值 4 1 水果种类 苹果 信息 数量 值 3 2 水果种类 梨 信息 价格 值 5 3 水果种类 梨 信息 数量 值 4 4 水果种类 草莓 信息 价格 值 6 5 水果种类 草莓 信息 数量 值 5'''

    print(stack_df.unstack(level=0)) #level默认为-1 即第一个索引旋转为列索引 若level = -1 则运行结果相当于df 否则如下

    ''' 0 1 2 3 4 5 水果种类 苹果 苹果 梨 梨 草莓 草莓 信息 价格 数量 价格 数量 价格 数量 值 4 3 5 4 6 5''' 'pivot(index,columns,values):将index指定为行索引,columns是列索引,values则是DataFrame中的值' df.pivot(index=None, columns=None,values=None) #index :将现有的 column values 设置为新 DataFrame 的 index,如果忽略,则使用现有的index #columns:将现有的 column values 设置为新 DataFrame 的 columns #values:将现有的 column values 设置为新 DataFrame 的 values,如果忽略,则将其他的 column values 全部作为新DataFrame 的 values print(df.pivot('水果种类','信息','')) #相当于print(df.set_index(['水果种类','信息']).unstack())

    (6)groupby按照某列分组操作

    df1 = df.groupby('carNo')    #返回一个group格式数据
    "选取分组后的某一列"
    df1 = df.groupby('oederTime_x')['carNo']    #返回一个SeriesGroupBy格式数据
    
    "查看每组的列数"
    res = df.groupby('carNo').size()
    
    "查看每组某一列包含的不重复的数据"
    res = df.groupby('carNo')['destTime'].unique()
    
    "分组后选取某一列进行求和"
    df.groupby('carNo')['factPrice'].sum()
    
    "查看每组不重复元素的个数"  #代码来自'分日车辆数(优化)'
    df1 = df.groupby('oederTime_x')['carNo'].unique()
    car_q = []
    for i in range(0,len(df1)):
        car_q.append(len(df1[i]))
    print(car_q)
    
    "选取某组某列,对值进行求和并排序"  #代码来自'巡游车收入统计(优化)'
    df_f['mile'] = df.groupby('oederTime_x')['driveMile'].sum().sort_index(ascending = True)
    
    "根据某两列进行分组"
    res = df.groupby(['carNo','depTime'])   #以列表的形式传入,先根据第一个分组,再根据第二个分组
    
    df_res = df_res.groupby(["O-D"], as_index=False)["count"].sum()  #代码来自路段流量
                            #as_index  = False 表示主键 'O-D'不做为索引,索引为1,2....

    (7)文件含异常数据处理

    "删除某一列中的空值所在行"
    df_q = df['depTime'].dropna(axis = 0,how = 'any')   #axis = 1表示删除列
    
    "将异常数据替换为NaN值"
    res = []
    for item in df['factPrice'].values:
        try:
            res.append(float(item))
        except:
            res.append(np.nan)
    df['Price'] = pd.DataFrame(data = res)
    
    "查看文件编码方式"
    def get_encoding(file):
     with open(file,'rb') as f:
      return chardet.detect(f.read())['encoding']
    
    file_name= r"C:UsersAdministratorDesktop测试ORDER_INFO11.csv"  #此处替换为你自己的文件路径
    encoding = get_encoding(file_name)
    print(encoding)
    
    "根据每一行的编码方式进行读取文件"
    # 获取文件编码类型
    def get_encoding(file):
        # 二进制方式读取,获取字节数据,检测类型
        with open(file, 'rb') as f:
            return chardet.detect(f.read())['encoding']
    
    data_path='数据集/week1.csv'
    df = pd.DataFrame()
    encoding = get_encoding(data_path) # get_encoding函数在上文
    f = open(data_path, encoding=encoding,errors='ignore')
    data = pd.read_csv(f)
    df = df.append(data)

    (8)apply、map、mapapply

    # 1.map()
    # map()是Series对象的一个函数,DataFrame中没有map(),map()的功能是将一个自定义函数作用于Series对象的每个元素。
    
    # 2.apply()
    # apply只是整个dataframe上任意一列或多列,或者一行或多行, 即可在任意轴操作。 在一列使用apply时,跟map效果一样。 多列时只能用apply。
    df['日期'] = df['日期'].apply(lambda x: str(x)[0:4]
                   
    # 3.applymap
    # applymap()函数的功能是将自定义函数作用于DataFrame的所有元素

    (9)保存文件

    df1.to_csv(r"C:UserschdDesktop出租19年1月.csv", index=False, header=0, mode='a')
    #index = False 表示不保存行索引,header = 0 表示不保存列索引 ,mode = 'a' 表示为追加写入形式
  • 相关阅读:
    git常用命令
    国内优秀npm镜像,nvm
    canvas --> getImageData()
    canvas sprite动画 简单封装
    springboot项目中ttf和woff字体图标页面无法显示
    树莓派配置Oracle JDK8
    记一次SqlServer大表查询语句优化和执行计划分析
    linux 查看某个进程和服务内存占用情况命令
    安装MySQL后,需要调整的10个性能配置项
    ARM架构上的Debian10编译timescaledb
  • 原文地址:https://www.cnblogs.com/jgua/p/14369852.html
Copyright © 2020-2023  润新知