Fork me on GitHub

Pandas函数-combine-update

combine、update和combine_first

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

  • combine
  • update
  • combine_first

导入库

1
2
import pandas as pd
import numpy as np

combine

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

案例1

1
2
df1 = pd.DataFrame({'A': [1, 0], 'B': [4, 3]})
df2 = pd.DataFrame({'A': [1, 1], 'B': [2, 3]})
1
df1
A B
0 1 4
1 0 3
1
df2
A B
0 1 2
1 1 3
1
2
3
# 合并1:使用自定义函数

df1.combine(df2, lambda s1,s2: s1 if s1.sum() > s2.sum() else s2)
A B
0 1 4
1 1 3

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

1
2
3
# 合并2:使用内置函数

df1.combine(df2, np.minimum)
A B
0 1 2
1 0 3

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

案例2

1
2
df3 = pd.DataFrame({'A': [np.nan, 0], 'B': [4, 3]})
df4 = pd.DataFrame({'A': [np.nan, 1], 'B': [2, np.nan]})
1
df3
A B
0 NaN 4
1 0.0 3
1
df4
A B
0 NaN 2.0
1 1.0 NaN
1
2
3
4
# 解释参数fill_value

# 缺失值填充8
df3.combine(df4, np.minimum,fill_value=8)
A B
0 8.0 2.0
1 0.0 3.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代替。

1
2
3
4
5
df5 = pd.DataFrame({'A': [0, 0], 'B': [4, 3]})

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

df5.combine(df6, lambda s1,s2: s1 if s1.sum() > s2.sum() else s2)
A B C
0 NaN 4.0 NaN
1 NaN 3.0 5.0
2 NaN NaN 6.0
1
2
3
# 使用参数overwrite

df5.combine(df6, lambda s1,s2: s1 if s1.sum() > s2.sum() else s2, overwrite=False)
A B C
0 0.0 4.0 NaN
1 0.0 3.0 5.0
2 NaN NaN 6.0

update

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

案例1

1
2
3
4
5
df7 = pd.DataFrame({'A': [1, 2, 3],
'B': [40, 50, 60]})

df8 = pd.DataFrame({'B': [4, 5, 6],
'C': [7, 8, 9]})
1
df7
A B
0 1 40
1 2 50
2 3 60
1
df8
B C
0 4 7
1 5 8
2 6 9
1
df7.update(df8)
1
df7
A B
0 1 4
1 2 5
2 3 6
1
df8
B C
0 4 7
1 5 8
2 6 9

合并之后我们发现:

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

案例2

1
2
3
4
5
df9 = pd.DataFrame({'A': [1, 2],
'B': [40, 50]}) # 长度为2

df10 = pd.DataFrame({'B': [4, 5, 6], # 长度为3
'C': [7, 8, 9]})
1
df9.update(df10)
1
df9
A B
0 1 4.0
1 2 5.0

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

案例3

1
2
3
4
df11 = pd.DataFrame({'A': [1, 2, 3],
'B': [40, 50, 60]}) # 长度为2

s = pd.Series([7,8],name="B", index=[0,2])
1
df11
A B
0 1 40
1 2 50
2 3 60
1
s
0    7
2    8
Name: B, dtype: int64
1
df11.update(s)
1
df11
A B
0 1 7.0
1 2 50.0
2 3 8.0
1
s1 = pd.Series([6,9],name="A", index=[0,1])
1
df11.update(s1)
1
df11
A B
0 6.0 7.0
1 9.0 50.0
2 3.0 8.0

案例4

存在空值的情况

1
2
3
4
5
df12 = pd.DataFrame({'A': [1, 2, 3],
'B': [40, 50, 60]})

df13 = pd.DataFrame({'B': [4, np.nan, 6],
'C': [7, 8, 9]})
1
df12
A B
0 1 40
1 2 50
2 3 60
1
df13
B C
0 4.0 7
1 NaN 8
2 6.0 9
1
df12.update(df13)
1
df12
A B
0 1 4.0
1 2 50.0
2 3 6.0

combine_first

1
DataFrame.combine_first(other)

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

1
2
3
df13 = pd.DataFrame({'A': [None, 0], 'B': [4, None]})

df14 = pd.DataFrame({'B': [3, 3], 'C': [1, 1]}, index=[1, 2])
1
df13
A B
0 NaN 4.0
1 0.0 NaN
1
df14
B C
1 3 1
2 3 1
1
df13.combine_first(df14)
A B C
0 NaN 4.0 NaN
1 0.0 3.0 1.0
2 NaN 3.0 1.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中

本文标题:Pandas函数-combine-update

发布时间:2022年10月09日 - 15:10

原始链接:http://www.renpeter.cn/2022/10/09/Pandas%E5%87%BD%E6%95%B0-combine-update.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea