(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' 表示为追加写入形式