文章目录
1.pands基础使用
1.1导入/展示
import numpy as np
import pandas as pd
pd.set_option('display.max_columns', None)#使pandas可以展示所有的列
pd.set_option('display.max_rows', None)#展示所有行
pd.set_option('max_colwidth',100)#默认表格里面的值超过50个字符则不显示 在这里改到100
出现IOPub data rate exceeded
cmd中输入:jupyter notebook --generate-config 在那个文件里找到iopub_data_rate_limit那一行改大就行 10000000000000000000
1.2 对象创建
1)Series
In [3]: s = pd.Series([1, 3, 5, np.nan, 6, 8])
In [4]: s
Out[4]:
0 1.0
1 3.0
2 5.0
3 NaN
4 6.0
5 8.0
dtype: float64
2)DataFrame
dates = pd.date_range('20130101', periods=6)#生成时间序列 6天 注意是daterange
Out[6]:
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
#index 索引 是最左侧的索引 不写 默认0-n columns是列名
Out[8]:
A B C D
2013-01-01 0.469112 -0.282863 -1.509059 -1.135632
2013-01-02 1.212112 -0.173215 0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929 1.071804
2013-01-04 0.721555 -0.706771 -1.039575 0.271860
2013-01-05 -0.424972 0.567020 0.276232 -1.087401
2013-01-06 -0.673690 0.113648 -1.478427 0.524988
3)Series转DataFrame
series= series.reset_index() #注意要赋值给自己 否则不起作用
1.3读入/写出csv
读入csv的时候会默认将第一行认为是头标签,如果不希望的话可以加入参数:header=None
这样pandas就会单独加上一列数据[0,1,2,3…]为列标签
data2 = pd.read_csv('./D/prod_info.csv',encoding='GBK') #读入变成dataframes encoding看情况
object.to_csv("csv名称.csv")# 写出csv
1.4 列名/列/删除
第一个表s列等于第二个表s列 注意列要提前存在 否则报错
tset["s"]=""#空列
tset["s"]=temp["s"]
2.pandas dataframes对象处理
下文df就指的是一个有数据的dataframes对象
2.1取值
索引选取
df[0:10] #取前10行数据
df[:-10]#一直取到-10行
df["total_cost"][0]#取total_cost这一列的第一个元素
df["total_cost"][0][1]#取total_cost这一列的第一个元素的第一个位置的元素(可迭代才能这么做)
条件选取
setdata=setdata[setdata["date_rcd"].isin([True])] #选取setdata表里面date_rcd列名中 有布尔值为true的行
datac=datac[~datac['tinyset'].isin([""])] #去除datac表中tinyset列的空值
查看所有列类型
df.dtypes
2.2 排序
df. sort_values()
调用方式
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind=‘quicksort’, na_position=‘last’)
默认按照列排序,即纵向排序;如果axis 为1,则是横向排序。
by:str or list of str;如果axis=0,那么by=“列名”;如果axis=1,那么by=“行名”。
ascending:布尔型,True则升序,如果by=[‘列名1’,‘列名2’],则该参数可以是[True, False],即第一字段升序,第二个降序。
inplace:布尔型,是否用排序后的数据框替换现有的数据框。
kind:排序方法,{‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’。似乎不用太关心。
na_position:{‘first’, ‘last’}, default ‘last’,默认缺失值排在最后面。
data2=data2.sort_values(by=["skc"],axis=0,ascending=True)#以skc这一列来排序 升序
data1=data1.sort_values(by=["skc","date_rcd"],axis=0,ascending=[True,False])#按照skc 升序,datercd降序来排序
Out:
90 100572118085 2018-01-05 3 497.50
89 100572118085 2018-01-03 1 173.75
88 100572118085 2018-01-01 1 143.75
166 100572118151 2019-05-19 1 28.75
165 100572118151 2018-12-08 1 28.75
164 100572118151 2018-02-16 1 88.75
2.3 groupby
分组举例:
1.datac[“real_cost”].groupby([datac[“tinyset”],datac[“date_rcd”]],as_index=True).sum()
分组同样的tinyset下 同样的 date_rcd的里面的real_cost 进行sum求和
as_index =true的不同之处:
有
???/?? price
books
bk1 36
bk2 30
bk3 17
无
books price
0 bk1 36
1 bk2 30
2 bk3 17
2.datacost = data1[“real_cost”].groupby([data1[“skc”],data1[“date_rcd”].apply(lambda y:(y.year,y.month))]).sum()
apply函数会对遇到的值运行指定的函数,data1[“date_rcd”].apply(lambda y:(y.year,y.month))] 就是把遇到的y值都转换为(y.year,y.month)的元组
分组同样的skc下 同样的 date_rcd的里面单独对象的year和month相等的情况下对同行的real_cost 进行sum求和
groupby sum之后的对象是series 需要转换成dataframe
sum mean count 都有
groupby().filter()还可以继续增加条件 ,filter接收的参数是 满足group条件的行对象
2)时间转换
将2019-04-02这样的转换成时间
只要换下面%Y %m中间的符号就可以适应其他格式
data1["date_rcd"] = pd.to_datetime(data1["date_rcd"],format ="%Y-%m-%d")