Python-pandas进阶篇

1、读取数据

data=DataFrame(np.arange(16).reshape(4,4),index=['BJ','SH','GZ','SZ'],columns=['one','two','three','four'])
data

out:
	one	two	three  four
BJ	0	1	 2	   3
SH	4	5	 6	   7
GZ	8	9	 10	   11
SZ	12	13	 14	   15
*****************************************************************************
# 删除行
val=data.drop(['SH','GZ'])

out:
	one	two	three four
BJ	0	1	2	  3
SZ	12	13	14	  15
*****************************************************************************
删除列
val2=data.drop('two',axis=1)

out:
	one	 three	four
BJ	0	 2	    3
SH	4	 6	    7
GZ	8	 10	    11
SZ	12	 14	    15
DataFrame的索引选项
类型说明
obj[val]选取DataFrame的单列或一组列。在特殊情况下会比较好用:布尔型数组(过滤行),切片(行切片),布尔型DataFrame(根据条件设置值)
obj.ix[val]选取DataFrame的单行或一组行
obj.ix[:,val]选取DataFrame的单列或列子集
obj.ix[val,val]同时选取行和列
reindex将一个或多个轴匹配到新索引
xs方法根据标签选取单行或单列值,返回一个Series
icol,irow根据整数位置选取单行或单列值,返回一个Series
get_value,set_value根据行标签,列标签选取单个值

直接选取所需的字段名

imdb[['订单编号','客户名称']].head(5) 

out:
    订单编号	  客户名称
0	SO45302   安徽30091自行车销售有限公司
1	SO45308	  安徽29861自行车销售有限公司
2	SO45326   安徽29906自行车销售有限公司
3	SO45342   安徽29521自行车销售有限公司
4	SO45343	  安徽29511自行车销售有限公司

切片选取

imdb.iloc[10:15,:2]


	订单编号	  经销商ID
10	SO45487	  J004
11	SO45533	  J004
12	SO45560	  J004
13	SO45581	  J004
14	SO45609	  J004

# 字段名也可做切片
imdb.loc[3:8,:'客户ID']  

out:
	订单编号	经销商ID	 经销商名称	        客户ID
3	SO45342	J004	 J004商贸有限公司	29521
4	SO45343	J004	 J004商贸有限公司	29511
5	SO45398	J004	 J004商贸有限公司	15059
6	SO45433	J004	 J004商贸有限公司	12547
7	SO45453	J004	 J004商贸有限公司	12549
8	SO45458	J004	 J004商贸有限公司	19599

get_value,set_value

df5
	one	two	three	
a	0	1	2	
b	4	5	6	
c	8	9	10	
d	12	13	14	

# 得到一个值
df5.get_value('a','two')
1

# 修改一个值
df5.set_value('a','two',100)
	one	two	three	
a	0	100	2	
b	4	5	6	
c	8	9	10	
d	12	13	14	

Series reindex

s1

out:
A    1
B    2
C    3
D    4
dtype: int64

# 修改索引并增加一行数据
s1.reindex(index=['a','b','C','D','E'],fill_value=10)

out:
a    10
b    10
C     3
D     4
E    10
dtype: int64
s2.reindex(index=range(15),method='ffill')     # 向下填充

多级index

s1=Series(np.random.randn(6),index=[['1','1','1','2','2','2'],['a','b','c','a','b','c']])v

out:
1  a    0.361075
   b   -1.270580
   c    1.028564
2  a    0.225356
   b    2.178631
   c   -0.130409
dtype: float64

# 转成DataFrame(两种方法)
df2=DataFrame([s1['1'],s1['2']])
df1=s1.unstack()

out:
	a	        b	        c
1	0.449214	0.136088	0.372118
2	-2.262097	-0.412335	-1.386246

# 还原回去
s3=df1.T.unstack()

Mapping 和 Replace(数据增加)
map通过一个字典或者一个函数进行替换,replace也可以通过一个字典,列表进行替换。

df1=DataFrame({"城市":['北京','上海','广州'],"人口":[1000,2000,1500]})

out:
    人口	城市
0	1000	北京
1	2000	上海
2	1500	广州
**************************************************************************
gdp_map={"北京":100,"上海":150,"广州":79}
df1['GDP2']=df1["城市"].map(gdp_map)
df1

	人口	城市		GDP2
0	1000	北京		100
1	2000	上海		150
2	1500	广州		79
s1=Series(np.arange(5))

out:
0    0
1    1
2    2
3    3
4    4
dtype: int32
***********************************************
s3=s1.replace([1,3,2],[10,20,30])

out:
0     0
1    10
2    30
3    20
4     4
dtype: int64

2、计算

2.1、直接相加

“+”,直接对应位置相加,没有共同索引的+NaN,在这里数字加 NaN 结果为 NaN。

df1+df2=df3
在这里插入图片描述
两张表只有“BJ”跟“SH”两行是共同的,所以这两行数据对应相加,其余的分加NaN。

2.2、设置填充值
df1=DataFrame(np.arange(9.).reshape(3,3),columns=list('abc'))

out:
    a	  b	    c
0	0.0	  1.0	2.0
1	3.0	  4.0	5.0
2	6.0	  7.0	8.0

df2=DataFrame(np.arange(12.).reshape(3,4),columns=list('abcd'))

out:
	a	  b	    c	    d
0	0.0	  1.0	2.0	    3.0
1	4.0	  5.0	6.0	    7.0
2	8.0	  9.0	10.0	11.0
********************************************************************
# 相加,没有的加上fill_value=0
df1.add(df2,fill_value=0)    

out:
    a	     b	    c	    d
0	0.0	     2.0	4.0	    3.0
1	7.0	     9.0	11.0	7.0
2	14.0	 16.0	18.0	11.0

# 共有的相加,没有的0填充
df1.add(df2).fillna(0)  

out:
    a	    b	   c	  d
0	0.0	    2.0	   4.0	  0.0
1	7.0	    9.0	   11.0	  0.0
2	14.0	16.0   18.0	  0.0

3、函数应用与映射

3.1、绝对值
每个值都变成绝对值
np.abs(df4)
    
3.2、apply

apply针对一行或一列做数据处理;applymap针对没一个值处理

df4=
    b	        c	        d
BJ	1.198335	1.680554	1.029306
SH	0.129341	-0.998620	1.441557
XM	-0.793182	0.721772	1.740997
SZ	0.255296	-0.023105	0.210413
**********************************************************************
f=lambda x: x.max()-x.min()
df4.apply(f,axis=1)

BJ    0.651249
SH    2.440177
XM    2.534179
SZ    0.278401
dtype: float64
***********************************************************************
# 保留两位小数
f=lambda x: '%.2f' % x
df4.applymap(f)

    b	    c	    d
BJ	1.20	1.68	1.03
SH	0.13	-1.00	1.44
XM	-0.79	0.72	1.74
SZ	0.26	-0.02	0.21
3.3、排序排名

sort_index:对索引值或字段名排列
axis=1:字段名进行排序
ascending=false:降序

df5=
	d	a	b	c
two	0	1	2	3
one	4	5	6	7
***********************************************************
df5.sort_index(axis=1,ascending=False)

out:
	d	c	b	a
two	0	3	2	1
one	4	7	6	5

sort_values:对值进行排列
axis=1:对行值进行排列(针对每一行处理)
ascending=false:降序
对于一张表要指定一行/列或按顺序几行列

df6=
	A	        B	        C
0	-0.361234	0.069717	-0.366472
1	-0.423020	0.110963	-0.325918
2	-0.195735	-0.498265	-0.752907
**********************************************************************
df6.sort_values('A',ascending=False)
     A	         B	         C
2	-0.195735	-0.498265	-0.752907
0	-0.361234	0.069717	-0.366472
1	-0.423020	0.110963	-0.325918

# 多列排序,先排A列,再排B列
df6.sort_values(by=['A','B'])

rank:排名

# 根据B列进行排名
df6['rank']=df6['B'].rank(ascending=False)
df6


    A	B	        C	        D	        E	        rank
0	a	-0.384627	0.082839	-0.667783	-0.644589	7.0
1	b	-0.272969	0.792157	0.456591	-1.285203	6.0
2	c	-0.503568	-0.335906	0.560092	-0.797560	8.0
3	d	1.004119	1.338095	0.240176	-1.031286	1.0
4	a	0.326208	-0.859344	-0.118520	0.549362	3.0
5	b	0.317478	0.393170	-0.806814	-0.091022	4.0
6	c	0.237057	0.581169	-0.194672	0.632306	5.0
7	a	0.939396	-1.946748	0.862878	-1.253296	2.0
3.4、汇总统计

NA值会自动被排除,除非整个切片(这里指的是行或列)都是NA。通过 skipna选项可以禁用该功能
df7.sum(axis=1,skipna=False)

df7.sum(axis=1)
df7.mean()
df7.mean()
df7.mean(skipna=False)

累加和


   one	two
a	2	0
b	7	-5
c	1	1
d	1	-2
***********************************************
df8.cumsum()

out:
	one	two
a	2	0
b	9	-5
c	10	-4
d	11	-6

isin
判断是否存在,返回True、False

0    a
1    a
2    b
3    a
4    a
5    b
dtype: object
*******************************************************
obj.isin(['b','c'])
0    False
1    False
2     True
3    False
4    False
5     True
dtype: bool
*******************************************************
# 找出含有b,c的值
obj[obj.isin(['b','c'])]
2    b
5    b
dtype: object

# 重复值判断
is_unique
返回TrueFalse

obj.index.is_unique



# 查找唯一值,返回的是值(去重后的值)
unique=obj.unique()
sorted(unique)
返回的值是无序的,如果需要排序,可以用uniques.sort()

# 值的计数
obj.value_counts()
pd.value_counts(obj.values,sort=False)
********************************************************************
	Qu1	Qu2	Qu3
0	1	2	1
1	3	3	2
2	4	1	3
3	3	2	5
4	4	3	6
# 转换成计数列表,统计表中每个数,在每一季度出现的次数
result=data.apply(pd.value_counts).fillna(0)

    Qu1	  Qu2	Qu3
1	1.0	  1.0	1.0
2	0.0	  2.0	1.0
3	2.0	  2.0	1.0
4	2.0	  0.0	0.0
5	0.0	  0.0	1.0
6	0.0	  0.0	1.0
3.5、简单缺失值处理
方法说明
dropna直接删除
fillna用指定值或插值法(ffill或bfill)填充缺失值
isnull返回一个含有布尔值的对象
notnull与isnull相反
data.dropna(how='all')    # 只有全部为nan时才删除

# 两种等同,返回的是df1
# df1=df1.fillna({'b':0,'d':df1['c'].mean()})
# _=df1.fillna({'b':0,'d':df1['c'].mean()},inplace=True)

4、字符串

5、时间序列

定义一个日期,使用datetime库

打印当前时间
from datetime import datetime
now=datetime.now()

out:
datetime.datetime(2019, 7, 24, 14, 26, 34, 777395)
*****************************************************************
now.year,now.month,now.day

out:
(2019, 7, 24)
两个时间相减,得到天数,秒数
delta=datetime(2011,1,7)-datetime(2008,6,24,10,20)
delta

out:
datetime.timedelta(days=926, seconds=49200)
******************************************************************
delta.days,delta.seconds

out:
(926, 49200)
日期减去天数,得到对应的日期
from datetime import timedelta

start=datetime(2011,1,7)
start+timedelta(12)

out:
datetime.datetime(2011, 1, 19, 0, 0)
*****************************************************
start-2*timedelta(12)

out:
datetime.datetime(2010, 12, 14, 0, 0)
修改日期格式
stamp=datetime(2018,7,12)
# 变成字符串
str(stamp)
'2018-07-12 00:00:00'

# 修改格式
stamp.strftime('%Y-%d-%m')
'2018-12-07'
from dateutil.parser import parse
value='2018-03-12'
parse(value)

out:
datetime.datetime(2018, 3, 12, 0, 0)
******************************************************************
parse('Jan 31,1997 10:15 PM')

out:
datetime.datetime(2018, 1, 31, 22, 15)
pandas 中的时间序列
value='2018-03-12'
pd.to_datetime(value)

out:
Timestamp('2018-03-12 00:00:00')
date_list=[
    datetime(2016,9,1),
    datetime(2016,9,10),
    datetime(2017,9,1),
    datetime(2017,9,20),
    datetime(2017,10,1)
]
s1=Series(np.random.randn(5),index=[date_list])
s1

out:
2016-09-01   -0.330027
2016-09-10    1.368937
2017-09-01   -0.442337
2017-09-20   -0.779019
2017-10-01   -0.931024
dtype: float64
**********************************************************
s1['2017']

out:
2017-09-01   -0.442337
2017-09-20   -0.779019
2017-10-01   -0.931024
dtype: float64
**********************************************************
s1['2016-09']

out:
2016-09-01   -0.330027
2016-09-10    1.368937
dtype: float64
创建时间序列
# 根据起始时间创建时间序列
index=pd.date_range('4/1/2012','6/6/2012')
index

# 根据时间间隔创建时间序列
index=pd.date_range(start='4/1/2012',periods=20)
index

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值