亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

搜索

使用Pandas在分組數(shù)據(jù)中按條件填充“截止日期”

聖光之護
發(fā)布: 2025-10-16 14:21:24
原創(chuàng)
1000人瀏覽過

使用Pandas在分組數(shù)據(jù)中按條件填充“截止日期”

本教程詳細闡述了如何利用pandas庫,在分組數(shù)據(jù)中高效地根據(jù)日期條件填充“截止日期”列。通過結(jié)合`groupby.ffill()`實現(xiàn)組內(nèi)向前填充缺失值,并利用`series.where()`進行條件篩選,確保只有當當前日期小于或等于填充的截止日期時,數(shù)據(jù)才會被更新,從而精確滿足復(fù)雜的數(shù)據(jù)填充需求。

引言:理解分組數(shù)據(jù)中的條件填充需求

在數(shù)據(jù)分析和處理中,尤其是在涉及時間序列或事件管理的數(shù)據(jù)集中,我們經(jīng)常需要對缺失值進行填充。然而,簡單的向前或向后填充往往不能滿足所有業(yè)務(wù)邏輯。一個常見的場景是,在一個按特定實體(例如“客戶-設(shè)備”)分組的數(shù)據(jù)集中,我們希望填充“截止日期”列的缺失值。但這種填充并非無條件的,它必須遵循一個重要的約束:只有當當前行的“日期”小于或等于被填充的“截止日期”時,該填充才有效。這意味著,一旦“日期”超出了有效的“截止日期”范圍,填充就應(yīng)該停止,或者該值應(yīng)該保持為NaN。

例如,考慮以下數(shù)據(jù)結(jié)構(gòu):

Customer-Equipment Date Closing Date
Customer1 - Eq A 2023-01-01 2023-01-05
Customer1 - Eq A 2023-01-02 NaN
Customer1 - Eq A 2023-01-03 NaN
Customer1 - Eq A 2023-01-04 NaN
Customer1 - Eq A 2023-01-05 NaN
Customer1 - Eq A 2023-01-06 NaN
Customer2 - Eq H 2023-01-01 2023-01-02
Customer2 - Eq H 2023-01-02 NaN
Customer2 - Eq H 2023-01-03 NaN

我們的目標是將Customer1 - Equipment A的Closing Date從2023-01-02到2023-01-05填充為2023-01-05,因為這些Date值都小于或等于2023-01-05。但2023-01-06的Date超出了2023-01-05,所以該行的Closing Date應(yīng)保持為NaN。Customer2 - Equipment H也遵循相同的邏輯。

數(shù)據(jù)準備

首先,我們創(chuàng)建一個示例DataFrame來模擬上述場景。確保日期列被正確解析為datetime類型,以便進行日期比較。

import pandas as pd
import numpy as np

# 創(chuàng)建示例數(shù)據(jù)
data = {
    'Customer-Equipment': [
        'Customer1 - Equipment A', 'Customer1 - Equipment A', 'Customer1 - Equipment A',
        'Customer1 - Equipment A', 'Customer1 - Equipment A', 'Customer1 - Equipment A',
        'Customer2 - Equipment H', 'Customer2 - Equipment H', 'Customer2 - Equipment H'
    ],
    'Date': [
        '2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06',
        '2023-01-01', '2023-01-02', '2023-01-03'
    ],
    'Closing Date': [
        '2023-01-05', np.nan, np.nan, np.nan, np.nan, np.nan,
        '2023-01-02', np.nan, np.nan
    ]
}

df = pd.DataFrame(data)

# 將日期列轉(zhuǎn)換為datetime類型
df['Date'] = pd.to_datetime(df['Date'])
df['Closing Date'] = pd.to_datetime(df['Closing Date'])

print("原始DataFrame:")
print(df)
登錄后復(fù)制

原始DataFrame:

        Customer-Equipment       Date Closing Date
0  Customer1 - Equipment A 2023-01-01   2023-01-05
1  Customer1 - Equipment A 2023-01-02          NaT
2  Customer1 - Equipment A 2023-01-03          NaT
3  Customer1 - Equipment A 2023-01-04          NaT
4  Customer1 - Equipment A 2023-01-05          NaT
5  Customer1 - Equipment A 2023-01-06          NaT
6  Customer2 - Equipment H 2023-01-01   2023-01-02
7  Customer2 - Equipment H 2023-01-02          NaT
8  Customer2 - Equipment H 2023-01-03          NaT
登錄后復(fù)制

核心解決方案:groupby.ffill() 與 Series.where() 的結(jié)合

解決此問題的關(guān)鍵在于兩個Pandas函數(shù)的巧妙結(jié)合:groupby.ffill()(組內(nèi)向前填充)和 Series.where()(條件篩選)。

步驟1:組內(nèi)向前填充 (groupby.ffill())

首先,我們需要在每個Customer-Equipment組內(nèi),將Closing Date列的有效值向前傳播,以填充其后的NaN值。這可以通過groupby()結(jié)合ffill()方法實現(xiàn)。

# 對'Closing Date'列進行組內(nèi)向前填充
s_ffilled = df.groupby('Customer-Equipment')['Closing Date'].ffill()

print("\n經(jīng)過ffill()填充后的Series:")
print(s_ffilled)
登錄后復(fù)制

經(jīng)過ffill()填充后的Series:

AppMall應(yīng)用商店
AppMall應(yīng)用商店

AI應(yīng)用商店,提供即時交付、按需付費的人工智能應(yīng)用服務(wù)

AppMall應(yīng)用商店56
查看詳情 AppMall應(yīng)用商店
0   2023-01-05
1   2023-01-05
2   2023-01-05
3   2023-01-05
4   2023-01-05
5   2023-01-05
6   2023-01-02
7   2023-01-02
8   2023-01-02
Name: Closing Date, dtype: datetime64[ns]
登錄后復(fù)制

此時,s_ffilled包含了所有潛在的填充值,但尚未考慮“日期”與“截止日期”的條件。例如,Customer1 - Equipment A的2023-01-06行也被填充為2023-01-05,這與我們的需求不符。

步驟2:條件篩選 (Series.where())

接下來,我們需要應(yīng)用條件:只有當Date列的值小于或等于填充后的Closing Date時,才保留填充值;否則,將其設(shè)置回NaN。Series.where()方法非常適合這種場景。它接受一個布爾條件,如果條件為True,則保留原值;如果條件為False,則替換為NaN(默認行為)或指定值。

在這里,我們的“原值”是s_ffilled,而“條件”是s_ffilled.ge(df['Date']),即判斷填充后的Closing Date是否大于或等于當前行的Date。

# 應(yīng)用條件篩選:只有當填充的截止日期 >= 當前日期時才保留
df['Closing Date'] = s_ffilled.where(s_ffilled.ge(df['Date']))
登錄后復(fù)制

完整代碼示例

將上述兩個步驟整合到一起,形成完整的解決方案:

import pandas as pd
import numpy as np

# 1. 創(chuàng)建示例數(shù)據(jù)
data = {
    'Customer-Equipment': [
        'Customer1 - Equipment A', 'Customer1 - Equipment A', 'Customer1 - Equipment A',
        'Customer1 - Equipment A', 'Customer1 - Equipment A', 'Customer1 - Equipment A',
        'Customer2 - Equipment H', 'Customer2 - Equipment H', 'Customer2 - Equipment H'
    ],
    'Date': [
        '2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05', '2023-01-06',
        '2023-01-01', '2023-01-02', '2023-01-03'
    ],
    'Closing Date': [
        '2023-01-05', np.nan, np.nan, np.nan, np.nan, np.nan,
        '2023-01-02', np.nan, np.nan
    ]
}

df = pd.DataFrame(data)

# 將日期列轉(zhuǎn)換為datetime類型
df['Date'] = pd.to_datetime(df['Date'])
df['Closing Date'] = pd.to_datetime(df['Closing Date'])

print("原始DataFrame:")
print(df)

# 2. 解決方案
# 步驟1: 對'Closing Date'列進行組內(nèi)向前填充
s_ffilled = df.groupby('Customer-Equipment')['Closing Date'].ffill()

# 步驟2: 應(yīng)用條件篩選,只有當填充的截止日期 >= 當前日期時才保留
df['Closing Date'] = s_ffilled.where(s_ffilled.ge(df['Date']))

print("\n處理后的DataFrame:")
print(df)
登錄后復(fù)制

結(jié)果分析

運行上述代碼后,我們將得到如下結(jié)果:

原始DataFrame:
        Customer-Equipment       Date Closing Date
0  Customer1 - Equipment A 2023-01-01   2023-01-05
1  Customer1 - Equipment A 2023-01-02          NaT
2  Customer1 - Equipment A 2023-01-03          NaT
3  Customer1 - Equipment A 2023-01-04          NaT
4  Customer1 - Equipment A 2023-01-05          NaT
5  Customer1 - Equipment A 2023-01-06          NaT
6  Customer2 - Equipment H 2023-01-01   2023-01-02
7  Customer2 - Equipment H 2023-01-02          NaT
8  Customer2 - Equipment H 2023-01-03          NaT

處理后的DataFrame:
        Customer-Equipment       Date Closing Date
0  Customer1 - Equipment A 2023-01-01   2023-01-05
1  Customer1 - Equipment A 2023-01-02   2023-01-05
2  Customer1 - Equipment A 2023-01-03   2023-01-05
3  Customer1 - Equipment A 2023-01-04   2023-01-05
4  Customer1 - Equipment A 2023-01-05   2023-01-05
5  Customer1 - Equipment A 2023-01-06          NaT
6  Customer2 - Equipment H 2023-01-01   2023-01-02
7  Customer2 - Equipment H 2023-01-02   2023-01-02
8  Customer2 - Equipment H 2023-01-03          NaT
登錄后復(fù)制

可以看到,Customer1 - Equipment A組中,從2023-01-01到2023-01-05的Closing Date都被正確填充為2023-01-05,因為這些日期都小于或等于2023-01-05。而2023-01-06的Date超出了2023-01-05,因此其Closing Date保持為NaT(Pandas中的NaN日期類型)。Customer2 - Equipment H組也得到了同樣正確的處理。

注意事項

  1. 數(shù)據(jù)類型至關(guān)重要: 確?!叭掌凇焙汀敖刂谷掌凇绷惺莇atetime類型。如果它們是字符串,日期比較將無法按預(yù)期工作,可能導(dǎo)致錯誤或不準確的結(jié)果。在示例中,我們使用了pd.to_datetime()進行轉(zhuǎn)換。
  2. 數(shù)據(jù)排序 此方法假定Date列在每個分組(Customer-Equipment)內(nèi)部是按升序排列的。如果不是,ffill()的行為可能不會產(chǎn)生預(yù)期的結(jié)果。在實際應(yīng)用中,可能需要先對DataFrame進行排序,例如df.sort_values(by=['Customer-Equipment', 'Date'], inplace=True)。
  3. 邊界情況:
    • 如果一個分組的Closing Date列的第一個非NaN值出現(xiàn)在較晚的日期,ffill()會從該日期開始向前填充。
    • 如果某個分組在ffill()后仍有NaN值(例如,該分組根本沒有有效的Closing Date,或者所有Date都超出了第一個Closing Date),那么這些NaN值將保持不變。

總結(jié)

本教程展示了一種高效且Pandas風格的方法,用于在分組數(shù)據(jù)中根據(jù)日期條件填充缺失值。通過結(jié)合groupby.ffill()進行組內(nèi)向前填充和Series.where()進行條件過濾,我們能夠精確地控制填充邏輯,滿足復(fù)雜的業(yè)務(wù)需求。這種方法不僅代碼簡潔,而且在處理大型數(shù)據(jù)集時通常具有良好的性能,是Pandas數(shù)據(jù)處理工具箱中的一個強大組合。

以上就是使用Pandas在分組數(shù)據(jù)中按條件填充“截止日期”的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!

最佳 Windows 性能的頂級免費優(yōu)化軟件
最佳 Windows 性能的頂級免費優(yōu)化軟件

每個人都需要一臺速度更快、更穩(wěn)定的 PC。隨著時間的推移,垃圾文件、舊注冊表數(shù)據(jù)和不必要的后臺進程會占用資源并降低性能。幸運的是,許多工具可以讓 Windows 保持平穩(wěn)運行。

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應(yīng)法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
最新問題
開源免費商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓,幫助PHP學習者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學習
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號