combine、update和combine_first
本文介绍的是3个Pandas函数的使用,主要是用于DataFrame的数据更新或者合并
导入库
代码语言:javascript复制import pandas as pd
import numpy as np
combine
代码语言:javascript复制DataFrame.combine(
other, # 另个DataFrame
func, # 拼接时使用的函数,可以是自定义的函数,也可以是Python或者numpy内置函数
fill_value=None, # 缺失值填充处理
overwrite=True) # 是否覆写
案例1
代码语言:javascript复制df1 = pd.DataFrame({'A': [1, 0], 'B': [4, 3]})
df2 = pd.DataFrame({'A': [1, 1], 'B': [2, 3]})
代码语言:javascript复制df1
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | 1 | 4 |
1 | 0 | 3 |
df2
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | 1 | 2 |
1 | 1 | 3 |
# 合并1:使用自定义函数
df1.combine(df2, lambda s1,s2: s1 if s1.sum() > s2.sum() else s2)
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | 1 | 4 |
1 | 1 | 3 |
解释1:每个Series求和再进行比较,取出较大的那个Series
代码语言:javascript复制# 合并2:使用内置函数
df1.combine(df2, np.minimum)
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | 1 | 2 |
1 | 0 | 3 |
解释2:每个位置上对应的元素进行比较,取出较小者
案例2
代码语言:javascript复制df3 = pd.DataFrame({'A': [np.nan, 0], 'B': [4, 3]})
df4 = pd.DataFrame({'A': [np.nan, 1], 'B': [2, np.nan]})
代码语言:javascript复制df3
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | NaN | 4 |
1 | 0.0 | 3 |
df4
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | NaN | 2.0 |
1 | 1.0 | NaN |
# 解释参数fill_value
# 缺失值填充8
df3.combine(df4, np.minimum,fill_value=8)
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
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代替。
代码语言:javascript复制df5 = pd.DataFrame({'A': [0, 0], 'B': [4, 3]})
df6 = pd.DataFrame({'B': [2, 3],'C':[5,6]},
index=[1,2] # 指定行索引,默认从0开始的自然数
)
代码语言:javascript复制df5
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | 0 | 4 |
1 | 0 | 3 |
df6
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
B | C | |
---|---|---|
1 | 2 | 5 |
2 | 3 | 6 |
# 默认情况
df5.combine(df6, lambda s1,s2: s1 if s1.sum() > s2.sum() else s2)
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | C | |
---|---|---|---|
0 | NaN | 4.0 | NaN |
1 | NaN | 3.0 | 5.0 |
2 | NaN | NaN | 6.0 |
# 使用参数overwrite
df5.combine(df6, lambda s1,s2: s1 if s1.sum() > s2.sum() else s2, overwrite=False)
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | C | |
---|---|---|---|
0 | 0.0 | 4.0 | NaN |
1 | 0.0 | 3.0 | 5.0 |
2 | NaN | NaN | 6.0 |
update
代码语言:javascript复制DataFrame.update(
other, # 另一个合并的数据
join='left', # 默认是保留left中的全部信息
overwrite=True, # 是否覆写
filter_func=None, # 过滤函数
errors='ignore') # 异常报错处理
案例1
代码语言:javascript复制df7 = pd.DataFrame({'A': [1, 2, 3],
'B': [40, 50, 60]})
df8 = pd.DataFrame({'B': [4, 5, 6],
'C': [7, 8, 9]})
代码语言:javascript复制df7
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | 1 | 40 |
1 | 2 | 50 |
2 | 3 | 60 |
df8
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
B | C | |
---|---|---|
0 | 4 | 7 |
1 | 5 | 8 |
2 | 6 | 9 |
df7.update(df8)
代码语言:javascript复制df7
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | 1 | 4 |
1 | 2 | 5 |
2 | 3 | 6 |
df8
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
B | C | |
---|---|---|
0 | 4 | 7 |
1 | 5 | 8 |
2 | 6 | 9 |
合并之后我们发现:
- df7已经原地修改,发生了变化
- df8是没有变化的
案例2
代码语言:javascript复制df9 = pd.DataFrame({'A': [1, 2],
'B': [40, 50]}) # 长度为2
df10 = pd.DataFrame({'B': [4, 5, 6], # 长度为3
'C': [7, 8, 9]})
代码语言:javascript复制df9.update(df10)
代码语言:javascript复制df9
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | 1 | 4.0 |
1 | 2 | 5.0 |
从结果中能够看到,只会保留最小长度的值
案例3
代码语言:javascript复制df11 = pd.DataFrame({'A': [1, 2, 3],
'B': [40, 50, 60]}) # 长度为2
s = pd.Series([7,8],name="B", index=[0,2])
代码语言:javascript复制df11
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | 1 | 40 |
1 | 2 | 50 |
2 | 3 | 60 |
s
代码语言:javascript复制0 7
2 8
Name: B, dtype: int64
代码语言:javascript复制df11.update(s)
代码语言:javascript复制df11
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | 1 | 7.0 |
1 | 2 | 50.0 |
2 | 3 | 8.0 |
s1 = pd.Series([6,9],name="A", index=[0,1])
代码语言:javascript复制df11.update(s1)
代码语言:javascript复制df11
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | 6.0 | 7.0 |
1 | 9.0 | 50.0 |
2 | 3.0 | 8.0 |
案例4
存在空值的情况
代码语言:javascript复制df12 = pd.DataFrame({'A': [1, 2, 3],
'B': [40, 50, 60]})
df13 = pd.DataFrame({'B': [4, np.nan, 6],
'C': [7, 8, 9]})
代码语言:javascript复制df12
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | 1 | 40 |
1 | 2 | 50 |
2 | 3 | 60 |
df13
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
B | C | |
---|---|---|
0 | 4.0 | 7 |
1 | NaN | 8 |
2 | 6.0 | 9 |
df12.update(df13)
代码语言:javascript复制df12
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | 1 | 4.0 |
1 | 2 | 50.0 |
2 | 3 | 6.0 |
combine_first
代码语言:javascript复制DataFrame.combine_first(other)
合并两个数据中某个位置第一次出现的元素;如何其中数据不存在,用空值NaN代替
代码语言:javascript复制df13 = pd.DataFrame({'A': [None, 0], 'B': [4, None]})
df14 = pd.DataFrame({'B': [3, 3], 'C': [1, 1]}, index=[1, 2])
代码语言:javascript复制df13
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
A | B | |
---|---|---|
0 | NaN | 4.0 |
1 | 0.0 | NaN |
df14
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
B | C | |
---|---|---|
1 | 3 | 1 |
2 | 3 | 1 |
df13.combine_first(df14)
.dataframe tbody tr th:only-of-type { vertical-align: middle; } <pre><code>.dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </code></pre>
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中