pandas学习—第五章

import numpy as np
import pandas as pd
df=pd.read_csv('E:\jupyter Notebook\天池比赛\pandas学习\joyful-pandas-master\data\\table.csv')
df.head()
Unnamed: 0SchoolClassIDGenderAddressHeightWeightMathPhysics
00S_1C_11101Mstreet_11736334.0A+
11S_1C_11102Fstreet_21927332.5B+
22S_1C_11103Mstreet_21868287.2B+
33S_1C_11104Fstreet_21678180.4B-
44S_1C_11105Fstreet_41596484.8B+

append and assign

append

利用序列添加行(必须指定name)

df_append=df.loc[:3,['Gender','Height']].copy()
df_append
GenderHeight
0M173
1F192
2M186
3F167
s=pd.Series({'Gender':'F','Height':188},name='new_row')
df_append.append(s)
GenderHeight
0M173
1F192
2M186
3F167
new_rowF188

利用DataFrame添加表

df_tmp=pd.DataFrame({'Gender':['F','M'],'Height':[188,176]},index=['new_1','new_2'])
df_append.append(df_tmp)
GenderHeight
0M173
1F192
2M186
3F167
new_1F188
new_2M176

assign方法

assign主要用于添加列,列名直接由参数指定

s=pd.Series(list('abcd'),index=range(4))
df_append.assign(Letter=s)
GenderHeightLetter
0M173a
1F192b
2M186c
3F167d

也可以一次添加多个列

df_append.assign(col1=lambda x:x['Gender']*2,col2=s)
GenderHeightcol1col2
0M173MMa
1F192FFb
2M186MMc
3F167FFd

combine and update

combine

  • combine 和 update都用于表填充函数,可以根据某种规则填充

1. 填充对象

df_combine_1=df.loc[:1,['Gender','Height']].copy()
df_combine_2=df.loc[10:11,['Gender','Height']].copy()
df_combine_1.combine(df_combine_2,lambda x,y:print(x,y))
#k
0       M
1       F
10    NaN
11    NaN
Name: Gender, dtype: object 0     NaN
1     NaN
10      M
11      F
Name: Gender, dtype: object
0     173.0
1     192.0
10      NaN
11      NaN
Name: Height, dtype: float64 0       NaN
1       NaN
10    161.0
11    175.0
Name: Height, dtype: float64
GenderHeight
0NaNNaN
1NaNNaN
10NaNNaN
11NaNNaN
df_combine_1
GenderHeight
0M173
1F192
df_combine_2
GenderHeight
10M161
11F175

相关例子

1. 根据列均值的大小填充

df1=pd.DataFrame({'A':[1,2],'B':[3,4]})
df2=pd.DataFrame({'A':[8,7],'B':[6,5]})
df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y)
AB
086
175

2.索引对齐特性(默认状态下,后面的表没有行列都会设置为NaN)

    df2=pd.DataFrame({'B':[8,7],'C':[6,5]},index=[1,2])
    df2
BC
186
275
df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y)
ABC
0NaNNaNNaN
1NaN8.06.0
2NaN7.05.0

3. 使得df1符合条件的值都不会被覆盖

df2=pd.DataFrame({'B':[8,7],'C':[6,5]},index=[1,2])
df1.combine(df2,lambda x,y: x if x.mean()>y.mean() else y,overwrite=False)
ABC
01.0NaNNaN
12.08.06.0
2NaN7.05.0

4.在新增匹配df2元素位置填充-1

df1.combine(df2,lambda x,y: x if x.mean()>y.mean() else y,fill_value=-1)
ABC
01.0-1.0-1.0
12.08.06.0
2-1.07.05.0

combine_first

  • 用df2填充df1的缺失值
df1=pd.DataFrame({'A':[None,0],'B':[4,None]})
df2=pd.DataFrame({'A':[3,3],'B':[1,1]})
df1.combine_first(df2)
AB
03.04.0
10.01.0
df2=pd.DataFrame({'B':[3,3],'C':[1,1]},index=[1,2])
df1.combine_first(df2)
ABC
0NaN4.0NaN
10.03.01.0
2NaN3.01.0

update方法

update方法的特点

1.返回的框索引只会与被调用框的一致(默认使用左连接)
2.第二个框的NaN元素不会起作用
3.没有返回值,直接在df上操作

相关例子

  • 索引完全对齐的情况下操作
df1=pd.DataFrame({'A':[1,2,3],'B':[400,500,600]})
df2=pd.DataFrame({'B':[4,5,6],'C':[7,8,9]})
df1.update(df2)
df1
AB
014
125
236
  • 部分填充
df1=pd.DataFrame({'A':['a','b','c'],'B':['x','y','z']})
df2=pd.DataFrame({'B':['d','e']},index=[1,2])
df1.update(df2)
df1
AB
0ax
1bd
2ce
  • 缺失值不会填充
df1=pd.DataFrame({'A':[1,2,3],'B':[400,500,600]})
df2=pd.DataFrame({'B':[4,np.nan,6]})
df1.update(df2)
df1
AB
014.0
12500.0
236.0

concat方法

  • contact方法可以在两个维度上拼接,默认纵向凭借(axis=0),拼接方式默认为外链接
  • 所谓外连接,就是取拼接方向的并集,而‘inner’时取拼接方向(若使用默认的纵向拼接,则为列的交集)的交集

相关例子

df1=pd.DataFrame({'A':['A0','A1'],'B':['B0','B1']},index=[0,1])
df2=pd.DataFrame({'A':['A2','A3'],'B':['B2','B3']},index=[2,3])
df3=pd.DataFrame({'A':['A1','A3'],'D':['D1','D3'],'E':['E1','E3']},index=[1,3])

默认拼接状态

pd.concat([df1,df2])
AB
0A0B0
1A1B1
2A2B2
3A3B3

axis=1时沿列方向拼接

pd.concat([df1,df2],axis=1)
ABAB
0A0B0NaNNaN
1A1B1NaNNaN
2NaNNaNA2B2
3NaNNaNA3B3

join设置为外连接

pd.concat([df1,df3],join='outer',sort=True)#sort 列排序
ABDE
0A0B0NaNNaN
1A1B1NaNNaN
1A1NaND1E1
3A3NaND3E3

key参数用于对不同的数据框增加一个标号,便于索引

pd.concat([df1,df2],keys=['x','y'])
pd.concat([df1,df2],keys=['x','y']).index
MultiIndex([('x', 0),
            ('x', 1),
            ('y', 2),
            ('y', 3)],
           )

merge and join

merge函数

  • merge函数的作用是将两个pandas对象横向合并,遇到重复的索引项时会使用笛卡尔积,默认inner连接,可选left,outer,right连接
  • 所谓左连接,就是指以第一个表索引为基准,右边的表中如果不再左边的则不加入,如果在左边的就以笛卡尔积的方式加入
  • merge/join与concat的不同之处在于on参数,可以指定某一个对象为key来进行连接

相关例子

left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                     'key2': ['K0', 'K1', 'K0', 'K1'],
                      'A': ['A0', 'A1', 'A2', 'A3'],
                      'B': ['B0', 'B1', 'B2', 'B3']}) 
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})
right2 = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                      'C': ['C0', 'C1', 'C2', 'C3']})
  • 以key1位准则连接,如果具有相同的列,则默认suffixes=(’_x’,’_y’)
pd.merge(left,right,on=['key1'])
key1key2_xABkey2_yCD
0K0K0A0B0K0C0D0
1K0K1A1B1K0C0D0
2K1K0A2B2K0C1D1
3K1K0A2B2K0C2D2
4K2K1A3B3K0C3D3

因为这里是用key1为对照的,那么按照笛卡尔积的规则,先看left的k0,然后找到right的k0所以k0合并之后有两行(2* 1),然后看left的k1,然后找到right的k1合并之后有两行(1* 2),最后看left里面的最后一个元素k2,找到right里面只有一个k2,所以k2最终有一行(1* 1)。这里的inner是指left的key1元素和right的key1元素取交集,而不是简单的行取交集。

  • 以多组键连接
df99=pd.merge(left,right,on=['key1','key2'])#具有交集key1=k0,k1,k2
df99
key1key2ABCD
0K0K0A0B0C0D0
1K1K0A2B2C1D1
2K1K0A2B2C2D2
  • 默认使用inner连接,因为merge只能横向拼接,所以取行向上keys的交集
pd.merge(left,right,how='outer',on=['key1','key2'])
key1key2ABCD
0K0K0A0B0C0D0
1K0K1A1B1NaNNaN
2K1K0A2B2C1D1
3K1K0A2B2C2D2
4K2K1A3B3NaNNaN
5K2K0NaNNaNC3D3
  • 左连接
pd.merge(left,right,how='left',on=['key1','key2'])
key1key2ABCD
0K0K0A0B0C0D0
1K0K1A1B1NaNNaN
2K1K0A2B2C1D1
3K1K0A2B2C2D2
4K2K1A3B3NaNNaN
  • 右连接
pd.merge(left,right,how='right',on=['key1','key2'])
key1key2ABCD
0K0K0A0B0C0D0
1K1K0A2B2C1D1
2K1K0A2B2C2D2
3K2K0NaNNaNC3D3

join函数

  • join函数的作用是将多个pandas对象横向拼接,遇到重复的索引项时会使用笛卡尔积,默认左连接,可选inner,outer,right连接
left=pd.DataFrame({'A':['A0','A1','A2'],'B':['B0','B1','B2']},index=['k0','k1','k2'])
right=pd.DataFrame({'C':['C0','C2','C3'],'D':['D0','D2','D3']},index=['k0','k2','k3'])
left.join(right)
ABCD
k0A0B0C0D0
k1A1B1NaNNaN
k2A2B2C2D2

问题与练习

问题

  1. 请思考什么是append/assign/combine/update/concat/merge/join各自最适合使用的场景,并举出相应的例子。

append:添加行
assign:添加列
combine:从两个表中根据某种规则,生成新的表(逐列相比较)
updae:用表B填充表A
concat:使用连接的方法从两个表中生成新的表(以集合的形式)
merge:使用连接的方法从两个表中生成新的表(以key的形式)
join:将多个pandas对象横向拼接,遇到重复的索引项时会使用笛卡尔积(可以使用左右连接)

  1. merge_ordered和merge_asof的作用是什么?和merge是什么关系?

pd.merge_ordered
#Perform merge with optional filling/interpolation.
#Designed for ordered data like time series data. Optionally
#另外 参数也更丰富,与merge相比 更有序?

  1. 请构造一个多级索引与多级索引合并的例子,尝试使用不同的合并函数。
index1 = pd.MultiIndex.from_tuples([('K0', 'K0'), ('K1', 'K0'),
                                   ('K2', 'K0'), ('K2', 'K1')],names=['key1','key2'])
index2 = pd.MultiIndex.from_tuples([('K0', 'K1'), ('K1', 'K0'),
                                   ('K2', 'K0'), ('K3', 'K1')],names=['key1','key2'])
left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3'],
                     'C': ['C0', 'C1', np.nan, 'C3']},index=index1)
right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']},
                     index=index2)
left.append(right)
ABCD
key1key2
K0K0A0B0C0NaN
K1K0A1B1C1NaN
K2K0A2B2NaNNaN
K1A3B3C3NaN
K0K1NaNNaNC0D0
K1K0NaNNaNC1D1
K2K0NaNNaNC2D2
K3K1NaNNaNC3D3
  1. 上文提到了连接的笛卡尔积,那么当连接方式变化时(inner/outer/left/right),这种笛卡尔积规则会相应变化吗?请构造相应例子。

inner:保留两对象都拥有的笛卡尔积
outer:保留全部的笛卡尔积
left:保留left对象所拥有的全部的笛卡尔积(默认缺失值用nan填充)
rifht:保留right对象所拥有的全部的笛卡尔积(默认缺失值用nan填充)

练习

df_1=pd.read_csv('E:\jupyter Notebook\天池比赛\pandas学习\joyful-pandas-master\data\\Employee1.csv')
df_2=pd.read_csv('E:\jupyter Notebook\天池比赛\pandas学习\joyful-pandas-master\data\\Employee2.csv')
df_1.head()
CompanyNameAgeHeightWeightSalary
0Aa14718863.725819
1Aa33917255.921983
2Aa44315862.521755
3Aa64218276.917354
4Aa74917194.66177
df_2.head()
CompanyNameAgeHeightWeightSalary
0Aa13015691.228133
1Aa25019083.46673
2Aa33416896.616503
3Aa55117697.223294
4Aa63718393.219256

1. 每个公司有多少员工满足如下条件:既出现第一张表,又出现在第二张表。

df_12=df_1.iloc[:,:2].assign(df_2.iloc[:,:1])
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-115-5c4ba62fe72d> in <module>
----> 1 df_12=df_1.iloc[:,:2].assign(df_2.iloc[:,:1])


TypeError: assign() takes 1 positional argument but 2 were given

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值