Pandas技巧,数据合并

简说Python

共 5211字,需浏览 11分钟

 · 2022-11-17

本文介绍的是3个Pandas函数的使用,主要是用于DataFrame的数据更新或者合并

  • combine
  • update
  • combine_first

导入库

import pandas as pd
import numpy as np

combine

DataFrame.combine(
    other, # 另个DataFrame
    func,  # 拼接时使用的函数,可以是自定义的函数,也可以是Python或者numpy内置函数
    fill_value=None#  缺失值填充处理
    overwrite=True)  # 是否覆写

案例1

df1 = pd.DataFrame({'A': [10], 'B': [43]})
df2 = pd.DataFrame({'A': [11], 'B': [23]})
df1

AB
014
103
df2

AB
012
113
# 合并1:使用自定义函数

df1.combine(df2, lambda s1,s2: s1 if s1.sum() > s2.sum() else s2)

AB
014
113

解释1:每个Series求和再进行比较,取出较大的那个Series

# 合并2:使用内置函数

df1.combine(df2, np.minimum) 

AB
012
103

解释2:每个位置上对应的元素进行比较,取出较小者

案例2

df3 = pd.DataFrame({'A': [np.nan, 0], 'B': [43]})
df4 = pd.DataFrame({'A': [np.nan, 1], 'B': [2, np.nan]})
df3

AB
0NaN4
10.03
df4

AB
0NaN2.0
11.0NaN
# 解释参数fill_value

# 缺失值填充8
df3.combine(df4, np.minimum,fill_value=8

AB
08.02.0
10.03.0

在进行比较的时候,是两个DataFrame相同的位置同时为空值才会进行指定值的填充; 如果只有一个DataFrame为空值,那么结果就是非空值

案例3

参数overwrite的使用:

If True, columns in self that do not exist in other will be overwritten with NaNs.

中文意思就是:如果某个属性字段在本身的DataFrame中存在,但是在另一个中不存在,那么合并的时候,如果overwrite=True,就会用NaN代替。

df5 = pd.DataFrame({'A': [00], 'B': [43]})

df6 = pd.DataFrame({'B': [23],'C':[5,6]}, 
                   index=[1,2]  # 指定行索引,默认从0开始的自然数
                  )
df5

AB
004
103
df6

BC
125
236
# 默认情况

df5.combine(df6, lambda s1,s2: s1 if s1.sum() > s2.sum() else s2)

ABC
0NaN4.0NaN
1NaN3.05.0
2NaNNaN6.0
# 使用参数overwrite

df5.combine(df6, lambda s1,s2: s1 if s1.sum() > s2.sum() else s2, overwrite=False)

ABC
00.04.0NaN
10.03.05.0
2NaNNaN6.0

update

DataFrame.update(
    other, # 另一个合并的数据
    join='left'# 默认是保留left中的全部信息
    overwrite=True# 是否覆写
    filter_func=None# 过滤函数
    errors='ignore')  # 异常报错处理

案例1

df7 = pd.DataFrame({'A': [123],
                   'B': [405060]})

df8 = pd.DataFrame({'B': [456],
                    'C': [789]})
df7

AB
0140
1250
2360
df8

BC
047
158
269
df7.update(df8)  
df7

AB
014
125
236
df8

BC
047
158
269

合并之后我们发现:

  • df7已经原地修改,发生了变化
  • df8是没有变化的

案例2

df9 = pd.DataFrame({'A': [12],
                   'B': [4050]})  # 长度为2

df10 = pd.DataFrame({'B': [456],  # 长度为3
                    'C': [789]})
df9.update(df10)  
df9  

AB
014.0
125.0

从结果中能够看到,只会保留最小长度的值

案例3

df11 = pd.DataFrame({'A': [123],
                   'B': [405060]})  # 长度为2

s = pd.Series([7,8],name="B", index=[0,2])
df11

AB
0140
1250
2360
s
0    7
2 8
Name: B, dtype: int64
df11.update(s)
df11

AB
017.0
1250.0
238.0
s1 = pd.Series([6,9],name="A", index=[0,1])
df11.update(s1)
df11

AB
06.07.0
19.050.0
23.08.0

案例4

存在空值的情况

df12 = pd.DataFrame({'A': [123],
                   'B': [405060]})

df13 = pd.DataFrame({'B': [4, np.nan, 6],
                    'C': [789]})
df12

AB
0140
1250
2360
df13

BC
04.07
1NaN8
26.09
df12.update(df13)
df12

AB
014.0
1250.0
236.0

combine_first

DataFrame.combine_first(other)

合并两个数据中某个位置第一次出现的元素;如何其中数据不存在,用空值NaN代替

df13 = pd.DataFrame({'A': [None0], 'B': [4None]})

df14 = pd.DataFrame({'B': [33], 'C': [11]}, index=[12])
df13

AB
0NaN4.0
10.0NaN
df14

BC
131
231
df13.combine_first(df14)

ABC
0NaN4.0NaN
10.03.01.0
2NaN3.01.0

上面结果的解释:

  • A:0号位置的元素出现在df13中为NaN,1号位置的元素也是出现在df13的A列中;2号为A列是没有的,用NaN代替
  • B:0号为的元素第一次在df13的B列,1和2号为都在df14的B列中
  • C:0号位置没有元素,用NaN代替;1和2号位置都是出现在df14中


--End--

1、想领取赠书,加我微信,朋友圈不定期送书;

2、想咨询学习,加我微信,每次咨询仅9.9元;

3、更多需求(学习 代码 视频剪辑),都可以加我微信,欢迎咨询。


扫码即可加我微信


分享

收藏

点赞

在看

浏览 23
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报