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)
-
一对一合并
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
-
多对一合并
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
-
多对多合并
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