数据分析之pandas知识梳理

Series及DataFrame部分知识梳理

一、Series索引与切片
  • 首先导入pandas和Series

     import pandas as pd
     from pandas import Series
    

显式索引:

  • 使用index中的元素作为索引值

  • 使用.loc[‘索引名’](推荐)

    s1 = Series(data=[1,2,3,4,5,6],index=list('abcdef'))
    s1
     a    1
     b    2
     c    3
     d    4
     e    5
     f    6
     dtype: int64
     s1.loc[['a','c']]  # 同一个维度 取多个值 要用中括号括起来
     a    1
     c    3
     dtype: int64
     s1.loc['b':'e':2]  # 也可以跳着取
     b    2
     d    4
     dtype: int64
     s1.loc['e':'b':-1]  # 注意 如果想倒着取 前面切片的属性 也得是倒着的
     e    5
     d    4
     c    3
     b    2
     dtype: int64
    

隐式索引:

  • 使用整数作为索引值

  • 使用.iloc[ 索引号 ](推荐)

     s1
     a    1
     b    2
     c    3
     d    4
     e    5
     f    6
     dtype: int64
     #整数数组形式的索引 通过iloc同样可以使用
     s1.iloc[[3,2,1,0]]
     d    4
     c    3
     b    2
     a    1
     dtype: int64
     s1.iloc[0:3]  # 显示索引 切片的时候是 包括最后一个的 隐式索引 不包括最后一个
     a    1
     b    2
     c    3
     dtype: int64
    
二、Series之间的运算
  • 在运算中自动对齐不同索引的数据
  • 如果索引不对应,则补NaN(值和NaN相加的结果还是NaN,如果想要让NaN的值当作0处理,可以用s1.add(s2,fill_value=0)来处理)
三、 Series与DataFrame之间的运算
  • axis=0:以列为单位操作(参数必须是列),对所有列都有效。

  • axis=1:以行为单位操作(参数必须是行),对所有行都有效。

    df = DataFrame(data=np.random.randint(0,10,size=(5,5)),index=list('abcde'),columns=list('01234'))
    df
    	0	1	2	3	4
    a	3	9	0	3	8
    b	8	6	2	3	0
    c	2	2	6	7	7
    d	6	7	1	3	1
    e	1	8	7	9	6
    s1 = Series(data=np.random.randint(0,10,size=5),index=list('01234'))
    s1
    0    1
    1    3
    2    1
    3    1
    4    9
    dtype: int32
    df+s1  # 表格和序列 相加 默认 每一行都要和序列相加 对应项相加
    	0	1	2	3	4
    a	4	12	1	4	17
    b	9	9	3	4	9
    c	3	5	7	8	16
    d	7	10	2	4	10
    e	2	11	8	10	15
    s2 = Series(data=np.random.randint(0,10,size=5),index=list('abcde'))
    s2
    a    4
    b    8
    c    5
    d    4
    e    6
    dtype: int32
    df+s2
    
    	0	1	2	3	4	a	b	c	d	e
    a	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN
    b	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN
    c	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN
    d	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN
    e	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN	NaN
    # axis='columns' 默认是columns 每一行和Series相加 让列名和Series中的索引去对应
    df.add(s2,axis='index')
    	0	1	2	3	4
    a	7	13	4	7	12
    b	16	14	10	11	8
    c	7	7	11	12	12
    d	10	11	5	7	5
    e	7	14	13	15	12
    
四、使用pd.concat()级联

pd.concat(objs, axis=0, join=‘outer’, join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True)

对于普通级联主要看 objs ignore_index axis 三个参数

import pandas as pd
from pandas import DataFrame,Series
df1
	0	1	2
0	4	9	3
1	2	3	8
2	4	8	3
df2
	0	1	2
0	2	5	8
1	7	6	2
2	6	6	7
pd.concat([df1,df2])
	0	1	2
0	4	9	3
1	2	3	8
2	4	8	3
0	2	5	8
1	7	6	2
2	6	6	7
# ignore_index 忽略行索引
pd.concat([df1,df2],ignore_index=True)
	0	1	2
0	4	9	3
1	2	3	8
2	4	8	3
3	2	5	8
4	7	6	2
5	6	6	7
pd.concat([df1,df2],axis=1)  # axis控制方向
	0	1	2	0	1	2
0	4	9	3	2	5	8
1	2	3	8	7	6	2
2	4	8	3	6	6	7

对于不匹配级联主要看 join keys join_axes 三个参数

df3
	a	b	c
0	4	9	3
1	2	3	8
2	4	8	3
df4
	b	c	d
0	2	5	8
1	7	6	2
2	6	6	7
pd.concat([df3,df4])

	a	b	c	d
0	4.0	9	3	NaN
1	2.0	3	8	NaN
2	4.0	8	3	NaN
0	NaN	2	5	8.0
1	NaN	7	6	2.0
2	NaN	6	6	7.0

sort=True/False避免报警告
pd.concat([df3,df4],sort=True,join=‘outer’) 外联 (并集) 保留两个表格都有的列
pd.concat([df3,df4],sort=True,join=‘inner’) 内联(取并集)
pd.concat([df3,df4],sort=True,join=‘left’) # 这里没有左联 和 右联
pd.concat([df3,df4],sort=True,join_axes=[df3.columns])
pd.concat([df3,df4],sort=True,join_axes=[df4.columns]) # 指定 保留哪些列
pd.concat([df3,df4],sort=True,keys=[‘A’,‘B’]) # 添加多重索引 用来区分 同样的行

五、pd.merge()合并

merge与concat的区别在于,merge需要依据某一共同的行或列来进行数据的融合

 pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
  1. 一对一合并

     t1 = pd.read_excel('../数据分析/day3/03_dataframe/03_dataframe/backup/data/demo.xls',sheet_name=0)
     t2 = pd.read_excel('../数据分析/day3/03_dataframe/03_dataframe/backup/data/demo.xls',sheet_name=1)
     t3 = pd.read_excel('../数据分析/day3/03_dataframe/03_dataframe/backup/data/demo.xls',sheet_name=2)
     t4 = pd.read_excel('../数据分析/day3/03_dataframe/03_dataframe/backup/data/demo.xls',sheet_name=3)
     
     display(t1,t2)
     	手机型号			参考价格
     0	windowsPhone	2500
     1	iPhone			7500
     2	Android			4000
     	手机型号			重量
     0	windowsPhone	0.50
     1	iPhone			0.40
     2	Android			0.45
     3	other			0.
     pd.merge(t1,t2)
     	手机型号			参考价格	重量
     0	windowsPhone	2500	0.50
     1	iPhone			7500	0.40
     2	Android			4000	0.45
    
  2. 多对一合并

     display(t2,t3)
     	手机型号			重量
     0	windowsPhone	0.50
     1	iPhone			0.40
     2	Android			0.45
     3	other			0.60
     	经销商	发货地区		手机型号
     0	pegge	beijing		iPhone
     1	lucy	beijing		Android
     2	tom		guangzhou	iPhone
     3	petter	shenzhen	windowsPhone
     4	mery	guangzhou	Android
     # pd.merge(t2,t3,how='inner')  # 内联 取交集 大家都有的才留下
     # pd.merge(t2,t3,how='outer')  # 外联 取并集 不管谁有 都留下
     # pd.merge(t2,t3,how='left')  # 左联 按照左边的集合 保留内容
     pd.merge(t2,t3,how='right')
     	手机型号			重量		经销商	发货地区
     0	windowsPhone	0.50	petter	shenzhen
     1	iPhone			0.40	pegge	beijing
     2	iPhone			0.40	tom	guangzhou
     3	Android			0.45	lucy	beijing
     4	Android			0.45	mery	guangzhou
    
  3. 多对多合并

     display(t3,t4)	
     	经销商	发货地区		手机型号
     0	pegge	beijing		iPhone
     1	lucy	beijing		Android
     2	tom		guangzhou	iPhone
     3	petter	shenzhen	windowsPhone
     4	mery	guangzhou	Android
     	发货地区		手机型号			价格
     0	beijing		iPhone			7000
     1	beijing		windowsPhone	2300
     2	beijing		Android			3600
     3	guangzhou	iPhone			7600
     4	guangzhou	windowsPhone	2800
     5	guangzhou	Android			4200
     6	shenzhen	iPhone			7400
     7	shenzhen	windowsPhone	2750
     8	shenzhen	Android			3900
     # 通过参数 on可以指定 匹配的列 默认列名一样的都去匹配
     # suffixes 后缀
     # pd.merge(t3,t4,on='手机型号')
     # pd.merge(t3,t4,on='手机型号')
     pd.merge(t3,t4,on='手机型号',suffixes=('_上半年','_下半年'))
     
     	经销商	发货地区_上半年	手机型号			发货地区_下半年	价格
     0	pegge	beijing			iPhone			beijing			7000
     1	pegge	beijing			iPhone			guangzhou		7600
     2	pegge	beijing			iPhone			shenzhen		7400
     3	tom		guangzhou		iPhone			beijing			7000
     4	tom		guangzhou		iPhone			guangzhou		7600
     5	tom		guangzhou		iPhone			shenzhen		7400
     6	lucy	beijing			Android			beijing			3600
     7	lucy	beijing			Android			guangzhou		4200
     8	lucy	beijing			Android			shenzhen		3900
     9	mery	guangzhou		Android			beijing			3600
     10	mery	guangzhou		Android			guangzhou		4200
     11	mery	guangzhou		Android			shenzhen		3900
     12	petter	shenzhen		windowsPhone	beijing			2300
     13	petter	shenzhen		windowsPhone	guangzhou		2800
     14	petter	shenzhen		windowsPhone	shenzhen		2750
    
六、Series、DataFrame索引和切片

1)Series的操作

s1 = Series([100,90,80,70,60,50],index=pd.MultiIndex.from_product([['期中','期末'],['语','数','外']]))
s1	
期中  语    100
	 数     90
	 外     80
期末  语     70
     数     60
     外     50
dtype: int64		
s1.loc['期末','语']
70
s1.loc[:]
#s1.loc['期中':'期末']
#s1.loc['语':'数']
# s1.loc[:,'语':'数']  # 注意 内层的切片 不能直接切
s1.loc['期中'].loc['语':'数']		
语    100
数     90
dtype: int64		
# 虽然 索引的层次多了 但是编号 还是 0 1 2 .. 按顺序往后排列的
s1.iloc[0:5]		
期中  语    100
	 数     90
	 外     80
期末  语     70
     数     60
dtype: int64							

2)DataFrame的操作

indexes = pd.MultiIndex.from_product([['期中','期末'],['语','数','外']])
columns = pd.MultiIndex.from_product([['一班','二班'],['01','02','03']])
data = np.random.randint(0,150,size=(6,6))
df1 = DataFrame(data,index=indexes,columns=columns)
df1		
			一班			二班
		01	02	03	01	02	03
期中	语	57	93	125	13	22	22
	数	34	22	0	53	142	25
	外	66	73	70	16	46	54
期末	语	17	97	100	128	123	146
	数	48	78	121	103	69	52
	外	146	37	46	109	47	30
df1['一班','01']
期中  语     57
	 数     34
 	 外     66
期末  语     17
     数     48
     外    146
Name: (一班, 01), dtype: int32
# df1.loc['期中','一班','语','01']  # 多重行索引也可以 行和列的索引也可以 但是 混合起来就不行了
df1.values[0,0]
df1.iloc[0,0]
57
df1.iloc[:,1:5]
			一班		二班
		02	03	01	02
期中	语	93	125	13	22
	数	22	0	53	142
	外	73	70	16	46
期末	语	97	100	128	123
	数	78	121	103	69
	外	37	46	109	47

猜你喜欢

转载自blog.csdn.net/python_lzt/article/details/83869683