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' 表示为追加写入形式
原文地址:https://www.cnblogs.com/jgua/p/14369852.html