嗨,我有以下資料集:
| EID | 公司 | 標清 | 教育署 |
|---|---|---|---|
| B12345 | A11 | 1/1/2021 | 3/1/2021 |
| B12345 | B11 | 1/1/2021 | 1/20/2021 |
| B12345 | C11 | 1/21/2021 | 2/1/2021 |
| B12345 | C11 | 2/2/2021 | 3/1/2021 |
| B12346 | A11 | 1/1/2010 | 12/31/2021 |
| B12346 | B11 | 1/1/2011 | 12/31/2015 |
| B12346 | C11 | 1/1/2022 | 12/31/2022 |
您可能已經觀察到這里的 EID B12345 日期,B11 和 C11 公司分別包含 A11 公司的日期。同樣,對于 EID B12346,B11 公司的日期包括 A11 公司的日期。所以我想在這里做的是對于我在資料框中擁有的所有 EID,我想檢查每個公司的開始日期 (SD) 和結束日期 (ED) 是否包括以前的公司。如果它們包含在內,則應采用日期在最大范圍內的公司的最終日期。如果日期不同,則按原樣獲取資料。因此輸出應包含公司 A11 的日期。
基本上,我想在這里檢查的是,每個 eid 的兩個日期列之間是否存在與公司相關的重疊,如果有,則取最大范圍,否則保持資料原樣。也不僅僅是將公司與以前的公司進行比較,還可以與以前的公司進行比較,以確定是否應淘汰以前的公司。預期輸出如下:
| EID | 公司 | 標清 | 教育署 |
|---|---|---|---|
| B12345 | A11 | 1/1/2021 | 3/1/2021 |
| B12346 | A11 | 1/1/2010 | 12/31/2021 |
| B12346 | C11 | 1/1/2022 | 12/31/2022 |
下面是我試過的代碼:
group = (df['SD'] <= df.groupby(['EID'['END'].shift()).groupby([df['EID']]).cumsum()
df = df.loc[df.groupby([df['EID'], group])['company'].idxmax()].sort_index()
我在這里遇到的錯誤是:
TypeError: reduction operation 'argmax' not allowed for this dtype
我一直無法理解此錯誤的含義。我什至嘗試更改公司列的資料型別,但仍然無法修復它。
任何線索將不勝感激。謝謝。!
uj5u.com熱心網友回復:
你的問題不完整。你不僅要和以前的公司比較,還要和之前的公司比較,如果之前的公司要淘汰的話。
否則,這將是一個簡單的比較:
df.groupby('EID').apply(
lambda group: group[~(
(group.SD >= group.SD.shift()) &
(group.ED <= group.ED.shift())
)]
)
但是,這會導致以下結果:
EID company SD ED
B12345 A11 1/1/2021 3/1/2021
B12345 C11 1/21/2021 2/1/2021
B12345 C11 2/2/2021 3/1/2021
B12346 A11 1/1/2010 12/31/2021
B12346 C11 1/1/2022 12/31/2022
現在,您想將 C11 與 A11 進行比較。你可以用一個(不太優雅)來做到這一點while loop:
different = True
while different:
df_orig = df.copy()
df = df.groupby('EID').apply(lambda group: group[~((group.SD >= group.SD.shift()) & (group.ED <= group.ED.shift()))]).reset_index(drop=True)
different = not df.equals(df_orig)
這將繼續執行相同的技巧,并且只有在結果資料幀等于原始資料幀時才會停止。
導致:
EID company SD ED
B12345 A11 1/1/2021 3/1/2021
B12346 A11 1/1/2010 12/31/2021
B12346 C11 1/1/2022 12/31/2022
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/397688.html
