pands groupby 排序

 

1.pandas基础使用

 

1.1导入

 

import numpy as np
import pandas as pd

 

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 基础设置

1)展示pandas全部列表

 

pd.set_option('display.max_columns', None)
#显示所有行
pd.set_option('display.max_rows', None)
#设置value的显示长度为100,默认为50
pd.set_option('max_colwidth',100)
#不设置就看不到全部

2)出现IOPub data rate exceeded
cmd中输入:jupyter notebook --generate-config 在那个文件里找到iopub_data_rate_limit那一行改大就行 10000000000000000000

 

1.4读入/写出csv

 

data2 = pd.read_csv('./D/prod_info.csv',encoding='GBK') #读入变成dataframes  encoding看情况
object.to_csv("csv名称.csv")# 写出csv

 

1.5 列名/列/删除

第一个表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])]  

查看所有列类型

 

df.dtypes

选取setdata里面date_rcd列名中 有布尔值为true的行

 

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这一列来排序 升序

 

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()
分组同样的skc下 同样的 date_rcd的里面单独对象的year和month相等的情况下对同行的real_cost 进行sum求和

注意apply接受的参数 data1["date_rcd"]里面每一个单独小对象 lambda y y就是那个对象
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") 
posted @ 2020-05-23 00:32  宋亦清  阅读(626)  评论(0)    收藏  举报