目录
Pandas读取文件
CSV文件读取
基本参数
分块读入相关参数
缺失值处理
pandas分组聚合
transform转换值
apply操作
merge数据合并
drop_duplicates()去重函数
Pandas字符串操作
三巨头map-apply-applymap
Pandas读取文件
pandas提供多种读取数据的方法:read_csv() 用于读取文本文件,read_excel()用于读取文本文件,read_json()用于读取json文件,read_sql_query()读取sql语句.
CSV文件读取
只需要记住csv文件是以逗号为分割的。
df=pd.read_csv("test.csv")
print(df,type(df))
基本参数
names:自行设置列名
headers:设置表头是从哪一行开始的
index_col:我们在读取文件之后所得到的DataFrame的索引默认是0、1、2……,我们可以通过set_index设定索引,但是也可以在读取的时候就指定某列为索引。
此时,birthday还是object的类型。我们可以使用pd.to_datetime(df.index)变成datetime类型。之后,使用df.index= pd.to_datetime(df.index)。
之后,就可以使用df['2004']去查找。需要注意,可以选择多个作为行标签index_col=["gender"."birthday"]
usecols:返回列的子集(你所需要的列)usecols=['name','birthday']
encoding:设置编码格式,pandas默认是utf-8。
dtype:指定读取的参数是什么格式的。dtype={“id”:str}表示让列名是id的以字符串的格式。
converters:在读取数据的时候对数据进行变换,例如id增加10。在使用converters参数时,解析器默认所有列的类型为str。
skiprows:表示过滤行,想要过滤哪些行,就写在一个列表里面传递给skiprows即可。skiprows=[0,3]。
skipfooter:从文件末尾过滤行。skipfooter=1。
nrows: 设置一次性读入的文件行数。nrows=3 只读三行。
na_values:读参数可以配置哪些值需要处理成NaN。na_values=["女","朱梦雪"]
parse_dates:将集合内所指定的列的数据变成时间格式。parse_dates=["birthday"]。
分块读入相关参数
iterator:迭代器, iterator 为 boo1类型,默认为False。如果为True,那么返回一个TextFileReader对象,以便逐块处理文件。这个在文件很大、内存无法容纳所有数据文件时,可以分批读入,依次处理。
chunk=pd.read_csv('data\students.csv',iterator=True)
print(chunk.get_chunk(2))#一次读取两行此时指针指向第三行
#如果还有数据可以给chunk赋更大的值,使数据一次性输出
#如果数据读取玩了,在读取就会报错因为指针已经指向末尾了
chunksize:设置文件块的大小。每次读取按块读取。
chunk=pd.read_csv('data\students.csv',chunksize=2)
#可以指定行数也可以不指定函数
print(chunk)
print(chunk.get_chunk(100))
缺失值处理
对于缺失值一般都是2中处理方式,要么删除要么填充。
删除缺失值dropna()
#删除至少缺少一个元素的行
df.dropna()
#删除至少缺少一个元素的列
df.dropna(axis='columns')
#删除确实所有元素的行
df.dropna(how='all')
#仅保留至少有2哥非NA值的行
df.dropna(thresh=2)
#定义在那些列中查找缺少的值
df.dropna(subset=['toy'])
#在同一个变量中保留操作数据
df.dropna(inplace=True)
缺失值补充fillna()
#将所有NaN元素替换成0
df.fillna(0)
#向前或向后传播非空值
df.fillna(method='ffill')
df.fillna(method='bfill')
#将A B C D 中所有的空按字典的值填充
values={"A":0,"B":1,"C":2,"D":3}
#只替换第一个NaN元素
df.fillna(0,limit=1)
#当使用数据填充时,替换会沿着相同的列名和索引进行
df2=pd.DataFrame(np.random.rand(4,4),columns=list("ABCD"))
df.fillna(value=df2)
pandas分组聚合
分组聚合groupby()
如上图的数据,可以使用groupby()。对company进行分组,group=data.groupby("company")。之后可以使用list(group)查看数据。
聚合操作agg():聚合(Aggregation)操作是groupby后非常常见的操作,会写SQL的朋友对此应该是非常熟悉了。聚合操作可以用来求和sum、均值mean、最大值max、最小值min等。
#计算不同员工的平均年龄和平均薪水
data.groupby("company").agg('mean')
data.groupby("company").mean()
data.groupby('company').agg({"salary":'median',"age":'mean'})
transform转换值
如以上数据,需要在原数据集中新增一列平均工资。
#先求平均值在求出列
data.groupby('company').mean()['salary']
#先求出列再去平均值
data.groupby('company')['salary'].mean()
#as_index=False 是否将分组列作为索引列,默认是True
data[['salary','company']].groupby('company',as_index=False).mean()
#to_dict将表格中的数据变成字典格式
avg_salary_dict=data.groupby('company')['salary'].mean().to_dict
#map()函数可以用于Series对象或DataFrame对象的一列,
#接收函数作为或字典对象作为参数,返回经过函数或字典映射处理后的值。
data['avg_salary']=data['company'].map(avg_salary_dict)
如果使用transform的话,只需要一行代码:
data['avg_salary1'] = data.groupby('company')['salary'].transform('mean')
apply操作
它相比agg和transform而言更加灵活,能够传入任意自定义的函数,实现复杂的数据操作对于groupby后的apply,以分组后的子DataFrame作为参数传入指定函数的,基本操作单位是DataFrame。
假设要实现获取各个公司年龄最大的员工的数据,该怎么实现呢?
def get_oldest_staff(x):
df=x.sort_values(by='age',ascending=True)
return df.iloc[-1]
oldest_staff=data.groupby('company',as_index=False).apply(get_oldest_staff)
oldest_staff
merge数据合并
merge的主要参数考虑left,right,how: str='inner',on=None,
情况一:一对一
#去两章表的交集 联合起来
df_1.merge(df_2,on='userid')
情况二:一对多
pd.merge(df_1,df_2,on='userid')
左连接(右链接也相同):左侧的都显示,右侧如果左侧没有则显示空
pd.merge(df_1,df_2,how='left',on='userid')
外连接:就是并集将所有连接的字段全部显示
drop_duplicates()去重函数
‘去重”通过字面意思不难理解,就是删除重复的数据。在一个数据集中,找出重复的数据删并将其删除,最终只保存一个唯一存在的数据项,这就是数据去重的整个过程。删除重复数据是数据分析中经常会遇到的一个问题。通过数据去重,不仅可以节省内存空间,提高写入性能,还可以提升数据集的精确度,使得数据集不受依复数据的影响。
Pandas字符串操作
Python会处理字符串起来会很容易,作为工具包的Pandas同样可以简单快速的处理字符串,几乎把Python内置的字符串方法都给复制过来了,这种方法就是Pandas内置的str方法,通俗来说就可以将series和index对象中包含字符串的部分简单看作单个字符串处理,达到批量简单快速处理的目的。
三巨头map-apply-applymap
apply:应用于DataFrame的行或列中
applymap:应用在DataFrame的每一个元素
map:应用在Series单独一列的每一个元素