1.对列进行重命名
两种方法:
rename
df.rename(columns={})
注意两点,columns这个参数名不能丢,columns后边跟字典,想改哪个改哪个
.columns
dfname.columns = []
注意两点,是个列表,列表必须包含所有的列名字
总结,只改几个名字用rename,都改用.column
2.根据列的值筛选数据
df[]
中括号里边写条件,写相等的条件的时候用==,当然也可以写>、
df[df['c1']==1 & df['c2']==1]
3.字符串转为日期
有一个最好用的函数,pd['字段名'].to_datetime()直接转换为日期格式,但是使用这个函数的前提是你的字段是一个日期格式的字符串。
这个转换的好处是,可以直接用.dt属性了,里边包装了很多函数,比如:获取年份,月份,日期,小时,甚至今天是周几等等。
然后还可以直接两列相减,转化为你需要的时间刻度,比如两个事件相隔几秒,几分钟,几小时。
注意点是,to_datetime()可以设置日期的格式,怎么设置的话,参考下面这个例子,其他怎么设置以此类推吧。
format ='%Y-%m-%d'
format = '%Y-%m-%d %H:%M:%S'
这里需要注意,我们都知道python字符串的日期函数strftime和strptime,当你转换为dt以后你就可以使用这两个函数进行自由的字符串和日期格式转换,但是前置任务一定是转换为datetime类型。
4.删除列或者行的数据
有两种方案,del和drop
del,del后边接数据框,del df['column1'],这个方法只能删除列,不能删除行。
drop,drop是一个函数,df.drop('column1',inplace=True)
注意一点,inplace这个参数,如果设置为True,那么将直接在数据框上修改。
这个函数,行列通吃,不过要删除行的时候需要指定index = [],要注意的是如果是默认的index(数字),千万不要加引号,否则报错。
df.drop([0,1])可以,但是df.drop(['0','1'])不行
5.选择某行某列的数据
这个不是按行或者按列选取数据,而是选取某行某列的具体数据。本来有三个方法,后来ix这个不让用了,省事了。用loc和iloc就可以。
iloc,为啥加个i,因为是按照索引来的,就是说是数字是标号,不是名字。
loc, 这个就是按照名字来的。
随便举个例子
data = [[1, 2, 3], [4, 5, 6]]
index = ['a', 'b']
column = ['left', 'center', 'right']
table = pd.DataFrame(data=data, index=index, columns=column)
- 例子1
table.iloc[0:1,1],输出a 2
-例子2
table.loc[['a','b'],'left']
输出:
a 1
b 4
6.对列元素进行操作
两种方法,一种是针对数字的to_numeric(),一种是针对所有类型的。
to_numeric(),转换为数字格式。
tmp['_score'] = tmp['_score'].apply(pd.to_numeric)
astype(),这个是强制转换,想转什么转什么
7.使用聚合函数
这个真的是最常用的,你可以想到的应用场景统计某一个类别下有多少量,统计一下平均单价,统计一下环比和同比增长,统计一下累积增加值等等,pandas都有函数可以用。在使用的时候需要配合一些函数来用,比如apply、agg、applymap。
直接用聚合函数,比如.sum,.avg,这个没啥好说的
apply函数
apply函数只能对待处理的列使用相同的函数,比如apply(np.sum,np.avg),注意应用这类函数加个np,要不然报错,其实就一列数据用这种聚合函数没有意义,一般后边接个lambda函数。
apply可以对整个dataframe使用,也可以单独对某一列使用,对整个dataframe是要按行列聚合的,区别于applymap,其他差不多。
map函数
map函数是python自带的,其作用就是对元素应用某个函数,可以接受的参数包括一个函数(可自定义)、或者一个映射关系的字典。
map这个函数只能对某一列或行的元素使用。
applymap函数
applymap函数对每一个元素都起作用,这个函数倒是可以对整的dataframe使用,但是始终是对元素进行操作的。
agg函数
agg这个函数和apply用法一样,它比较厉害的地方在于可以用一个字典做参数,定义每一个字段使用的聚合函数,比方说:df.agg({'ext price': ['sum', 'mean'], 'quantity': ['sum', 'mean'], 'unit price': ['mean']})
8.groupby操作
groupby的作用是按照某个字段进行分组,这个语法本身并不难,但是写法比较多,容易弄混。
dfname.groupby().ziduan.sum()
推荐写法,都按照这个方法写不容易弄混。groupby括号里直接写column的名字,如果是多个字段分组,用中括号扩起来。然后要统计的字段直接用点接上,如果好几个字段,加个apply或者agg也行。
dfname[ziduan].groupby(dfname[]).sum()
这个写法直接把要统计的字段写在前边,groupby的时候要把dfname再写上否则报错。
groupby以后这个dataframe的index就变了,需要reset_jndex一下才行。
9.计数操作
为啥把这个拿出来说呢,因为计数的需求很迷,和sum、avg完全不一样,比较常见的其实就两个需求。
统计某一列有几个元素(去重)
为啥去重,不去重没啥意义啊,不多说(比如说useid这个字段有几个不同的值)。
df.col1.drop_duplicated().count()
df.col1.nunique()
个人觉得优先使用第二个函数,然后这个还有个unique会把元素都给你返回来。
统计某一列某个元素出现几次
df.col1.value_counts()
10.na值处理
两个函数,dropna,fillna。里边参数自由组合,可以实现各种需求。
11.数据框的合并
可选的函数有merge、concat、join等。
concat
最简单的连接函数,就是按行或者列进行拼接,按行就是axis = 0,按列就是axis = 1,默认是按行进行拼接。
df1 = pd.DataFrame({'city': ['Chicago', 'San Francisco', 'New York City'], 'rank': range(1, 4)})
df2 = pd.DataFrame({'city': ['Chicago', 'Boston', 'Los Angeles'], 'rank': [1, 4, 5]})
pd.concat([df1,df2])
pd.concat([df1,df2],axis=1)
这里两个地方容易犯错:
你要拼接的两个df没有用中括号括起来,pd.merge(df1,df2);
你用df去调用merge函数,df1.merge(df2)。
merge
这个函数最接近于sql里的join,功能类似,参数多,挑重要的说。
on
按照哪个键join,可以是一个也可以是多个,当然不写的话就按公共的键join,写多个的话用()括起来。
how
什么连接方式,left,right还是outer,inner,不写的话就是inner。
left_on,right_on,left_index,right_index
设置左右的dataframe按照什么列名进行连接,index就是说按照索引名进行连接。
suffixes
这个参数就是说左右的列名一样了,你怎么处理,加什么后缀区分。
data1=pd.DataFrame([{"id":100,"name":'lxh','cs':10},{"id":101,"name":'xiao','cs':40},{"id":102,"name":'hua2','cs':50}])
data2=pd.DataFrame([{"id":0,"name":'lxh','cs':10},{"id":0,"name":'lxh','cs':10},{"id":101,"name":'xiao','cs':40},{"id":102,"name":'hua2','cs':50}])
pd.merge(data1,data2,on='name',how = 'left')
join
前边说了merge类似于sql里的join,那么pandas里多设置一个join是要干嘛。
首先说join的很多参数和merge是一样的,区别就是,join以index作为连接键,默认选择的连接方式是left,还有一处比较特别的是它可以一次join多个dataframe,而merge是不可以的。
merge和join都可以把dataframe写在前边,也就是可以df1.join,df1.merge,我觉得关于这两个直接用merge就行。