我有以下資料集:
| EID | CLEAN_NAME | 開始日期 | 結束日期 |
|---|---|---|---|
| A111 | 美國廣播公司 | 2003-11-01 | 2005-12-31 |
| A111 | 防御工事 | 2005-12-01 | 2007-08-31 |
| A111 | 全球健康指數 | 2007-09-01 | 2012-01-31 |
| A111 | 全球健康指數 | 2012-01-01 | 2013-05-31 |
| A111 | JKL | 2013-06-01 | 2015-03-31 |
| A111 | 移動網路運營商 | 2015-04-01 | 2016-04-30 |
| A111 | 全球健康指數 | 2016-04-18 | 2017-11-07 |
| A111 | 全球健康指數 | 2017-11-01 | 鈉鹽 |
以下是預期的結果:
| EID | CLEAN_NAME | 開始日期 | 結束日期 |
|---|---|---|---|
| A111 | 美國廣播公司 | 2003-11-01 | 2005-12-31 |
| A111 | 防御工事 | 2005-12-01 | 2007-08-31 |
| A111 | 全球健康指數 | 2007-09-01 | 2013-05-31 |
| A111 | JKL | 2013-06-01 | 2015-03-31 |
| A111 | 移動網路運營商 | 2015-04-01 | 2016-04-30 |
| A111 | 全球健康指數 | 2016-04-18 |
我在這里嘗試做的是讓公司根據他們的 EID 和 CLEAN_NAME 匯總公司資料,并采用 Start_Date 的最小值和 End_Date 的最大值。如果我對 GHI 公司進行簡單聚合,Start_Date 的最小值將是 2007-09-01,End_Date 的最大值將是 2017-11-07,這是不正確的。
基本上我想將 GHI 公司分開,因為它們是兩個不同的資料。我知道我可能必須使用 EID、CLEAN_NAME 和 Start_Date 和 End_Date 的嵌套 for 回圈來比較每行之間的資料,但我似乎無法讓它作業,因為我無法理解實作它的用法和邏輯回圈。這是我開始的內容(沒什么可繼續的,但仍然......):
for i in df['EID']:
for j in df['CLEAN_NAME']:
if j == j-1
for k in df['Start_Date']:
print(df['EID'])
這只是一個檢查嵌套 for 回圈如何作業的示例(它沒有,因為如果 j == j-1,我得到了一個錯誤)。我是 python 的新手,仍然試圖弄清楚事情是如何作業的。
另請注意,資料集已根據 EID、Start_date、End_date 和 CLEAN_NAME 進行排序。所以基本上我必須將連續重復的行與 Start_date 的最小值和 End_date 的最大值以及最后一家公司的 Start_date 和 End_date 的最小值合并為 NULL,因為它表明該員工目前在這家公司作業..
任何線索將不勝感激謝謝。!
uj5u.com熱心網友回復:
好吧,這是一種不使用回圈的解決方案。
df['groups'] = (df['CLEAN_NAME'].ne(df['CLEAN_NAME'].shift())).cumsum()
df = df.groupby(["groups"]).agg({"EID": "first", "CLEAN_NAME": "first", "Start_Date": min, "End_Date": max}).reset_index()
print(df[["EID", "CLEAN_NAME", "Start_Date", "End_Date"]])
在這種方法中,我們創建了連續出現的具有相同 CLEAN_NAME 的行組。然后,根據組聚合 df。
輸出看起來像這樣
EID CLEAN_NAME Start_Date End_Date
0 A111 ABC 2003-11-01 2005-12-31
1 A111 DEF 2005-12-01 2007-08-31
2 A111 GHI 2007-09-01 2013-05-31
3 A111 JKL 2013-06-01 2015-03-31
4 A111 MNO 2015-04-01 2016-04-30
5 A111 GHI 2016-04-18 NaT
這對你有用嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/392109.html
上一篇:在VBA中洗掉第i行和下一行
