2 回答

TA貢獻1865條經驗 獲得超7個贊
這是一個不需要任何硬編碼的答案。
第一步:按應該相等的前 9 個字符以及 issue_date 分組。實際上,您不需要考慮 A 或 T 是第 10 個字符的情況。
做出了以下假設:
索引無關緊要
當債券的前 9 個字符相同時:僅保留第一次出現
df_grouped = (df.groupby([df.bond.str[:9], df.issue_date])
.agg({'bond': ['first', 'nunique']}))
bond
first nunique
bond issue_date
XSD070623 01.01.2020 XSD070623A17 2
XSD070623 10.11.2019 XSD070623T15 1
XSD090222 03.05.2020 XSD090222A10 2
XSD100221 05.02.2020 XSD100221A18 1
XSD100221 12.10.2020 XSD100221T11 1
第二步:堆疊分組的數據框
df_grouped = df_grouped.unstack()
第三步:過濾掉只有一個發行日期的行,用于共享前 9 個字符的債券。然后,堆疊結果,并重置索引
df_grouped[df_grouped['nunique'].count(axis=1) > 1].stack().reset_index()
bond issue_date first nunique
0 XSD070623 01.01.2020 XSD070623A17 2.0
1 XSD070623 10.11.2019 XSD070623T15 1.0
2 XSD100221 05.02.2020 XSD100221A18 1.0
3 XSD100221 12.10.2020 XSD100221T11 1.0
最后一步:保留有用的列
df_grouped[['first', 'issue_date']].rename(columns={'first': 'bond'})
first issue_date
0 XSD070623A17 01.01.2020
1 XSD070623T15 10.11.2019
2 XSD100221A18 05.02.2020
3 XSD100221T11 12.10.2020
請在更大的數據集上嘗試這個,如果需要任何改進,請告訴我:)

TA貢獻1773條經驗 獲得超3個贊
我們可以在此處使用正則表達式,df['bond'].str.contains()因為您只需要帶有XSD070623or的行XSD100221,并且還想刪除具有相同值的行issue-date。這是我所做的:
#your df:
>>> df
bond issue_date
0 XSD070623A17 01.01.2020
1 XSD090222A10 03.05.2020
2 XSD100221A18 05.02.2020
3 XSD070623T15 10.11.2019
4 XSD070623T23 01.01.2020
5 XSD090222T32 03.05.2020
6 XSD100221T11 12.10.2020
現在應用正則表達式來滿足列的第一個條件bond并刪除issue-date列的重復項并考慮第一個,我做了:
>>> df[df['bond'].str.contains('XSD070623|XSD100221')].drop_duplicates(subset='issue_date', keep="first")
bond issue_date
0 XSD070623A17 01.01.2020
2 XSD100221A18 05.02.2020
3 XSD070623T15 10.11.2019
6 XSD100221T11 12.10.2020
以上'XSD070623|XSD100221'將被視為正則表達式,我們將刪除issue-date列中的重復項并保留第一個(在我們的例子中)。
添加回答
舉報