本文介紹的是3個Pandas函數(shù)的使用,主要是用于DataFrame的數(shù)據(jù)更新或者合并:

導入庫
import pandas as pd
import numpy as np
combine
DataFrame.combine(
other, # 另個DataFrame
func, # 拼接時使用的函數(shù),可以是自定義的函數(shù),也可以是Python或者numpy內(nèi)置函數(shù)
fill_value=None, # 缺失值填充處理
overwrite=True) # 是否覆寫
案例1
df1 = pd.DataFrame({'A': [1, 0], 'B': [4, 3]})
df2 = pd.DataFrame({'A': [1, 1], 'B': [2, 3]})
df1
df2
# 合并1:使用自定義函數(shù)
df1.combine(df2, lambda s1,s2: s1 if s1.sum() > s2.sum() else s2)
解釋1:每個Series求和再進行比較,取出較大的那個Series
# 合并2:使用內(nèi)置函數(shù)
df1.combine(df2, np.minimum)
解釋2:每個位置上對應的元素進行比較,取出較小者
案例2
df3 = pd.DataFrame({'A': [np.nan, 0], 'B': [4, 3]})
df4 = pd.DataFrame({'A': [np.nan, 1], 'B': [2, np.nan]})
df3
df4
# 解釋參數(shù)fill_value
# 缺失值填充8
df3.combine(df4, np.minimum,fill_value=8)
在進行比較的時候,是兩個DataFrame相同的位置同時為空值才會進行指定值的填充; 如果只有一個DataFrame為空值,那么結(jié)果就是非空值
案例3
參數(shù)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': [0, 0], 'B': [4, 3]})
df6 = pd.DataFrame({'B': [2, 3],'C':[5,6]},
index=[1,2] # 指定行索引,默認從0開始的自然數(shù)
)
df5
df6
# 默認情況
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 |
|---|
# 使用參數(shù)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
DataFrame.update(
other, # 另一個合并的數(shù)據(jù)
join='left', # 默認是保留left中的全部信息
overwrite=True, # 是否覆寫
filter_func=None, # 過濾函數(shù)
errors='ignore') # 異常報錯處理
案例1
df7 = pd.DataFrame({'A': [1, 2, 3],
'B': [40, 50, 60]})
df8 = pd.DataFrame({'B': [4, 5, 6],
'C': [7, 8, 9]})
df7
df8
df7.update(df8)
df7
df8
合并之后我們發(fā)現(xiàn):
- df7已經(jīng)原地修改,發(fā)生了變化
案例2
df9 = pd.DataFrame({'A': [1, 2],
'B': [40, 50]}) # 長度為2
df10 = pd.DataFrame({'B': [4, 5, 6], # 長度為3
'C': [7, 8, 9]})
df9.update(df10)
df9
從結(jié)果中能夠看到,只會保留最小長度的值
案例3
df11 = pd.DataFrame({'A': [1, 2, 3],
'B': [40, 50, 60]}) # 長度為2
s = pd.Series([7,8],name="B", index=[0,2])
df11
s
0 7
2 8
Name: B, dtype: int64
df11.update(s)
df11
s1 = pd.Series([6,9],name="A", index=[0,1])
df11.update(s1)
df11
案例4
存在空值的情況
df12 = pd.DataFrame({'A': [1, 2, 3],
'B': [40, 50, 60]})
df13 = pd.DataFrame({'B': [4, np.nan, 6],
'C': [7, 8, 9]})
df12
df13
df12.update(df13)
df12
combine_first
DataFrame.combine_first(other)
合并兩個數(shù)據(jù)中某個位置第一次出現(xiàn)的元素;如何其中數(shù)據(jù)不存在,用空值NaN代替
df13 = pd.DataFrame({'A': [None, 0], 'B': [4, None]})
df14 = pd.DataFrame({'B': [3, 3], 'C': [1, 1]}, index=[1, 2])
df13
df14
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 |
|---|
上面結(jié)果的解釋:
- A:0號位置的元素出現(xiàn)在df13中為NaN,1號位置的元素也是出現(xiàn)在df13的A列中;2號為A列是沒有的,用NaN代替
- B:0號為的元素第一次在df13的B列,1和2號為都在df14的B列中
- C:0號位置沒有元素,用NaN代替;1和2號位置都是出現(xiàn)在df14中
1、想領(lǐng)取贈書,加我微信,朋友圈不定期送書;
2、想咨詢學習,加我微信,每次咨詢僅9.9元;
3、更多需求(學習 代碼 視頻剪輯),都可以加我微信,歡迎咨詢。
掃碼即可加我微信