前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pandas函数-combine-update

Pandas函数-combine-update

作者头像
皮大大
发布2023-08-25 11:49:09
1930
发布2023-08-25 11:49:09
举报

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

代码语言:javascript
复制
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

代码语言:javascript
复制
# 合并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

代码语言:javascript
复制
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

代码语言:javascript
复制
# 解释参数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

代码语言:javascript
复制
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

代码语言:javascript
复制
# 默认情况

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

代码语言:javascript
复制
# 使用参数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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言: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>

B

C

0

4.0

7

1

NaN

8

2

6.0

9

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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中
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-9,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • combine、update和combine_first
  • 导入库
  • combine
    • 案例1
      • 案例2
        • 案例3
        • update
          • 案例1
            • 案例2
              • 案例3
                • 案例4
                • combine_first
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档