亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何過濾一列包含相似模式但另一列包含不同值的行

如何過濾一列包含相似模式但另一列包含不同值的行

守候你守候我 2023-03-08 16:12:07
我在熊貓中有這個數據框:df = pd.DataFrame(             {"bond": ["XSD070623A17","XSD090222A10","XSD100221A18", "XSD070623T15",                        "XSD070623T23","XSD090222T32","XSD100221T11"],             "issue_date":["01.01.2020", "03.05.2020", "05.02.2020", "10.11.2019",                            "01.01.2020", "03.05.2020", "12.10.2020"]             }             )df    bond            issue_date0   XSD070623A17    01.01.20201   XSD090222A10    03.05.20202   XSD100221A18    05.02.20203   XSD070623T15    10.11.20194   XSD070623T23    01.01.20205   XSD090222T32    03.05.20206   XSD100221T11    12.10.2020如您所見,“債券”列中某些值的前 9 個字符相同。我將得到這個數據框的一個子集,對于第 10 個字符等于“A”的每個值,我想得到前 9 個字符相同且第 10 個字符等于“T”的值。之后,如果“A”和“T”債券的發行日期不同,那么我想過濾這兩種債券。例如,第 0 個索引的債券值與第 3 個和第 4 個索引的值具有相同的模式,但第 0 個和第 4 個索引的發行日期相同,所以我想過濾第 0 行和第 3 行。另一方面,第一個指數的債券價值與第五個指數具有相同的模式,但它們的發行日期相同,所以我不想過濾它們。畢竟,我想獲得以下數據框:    bond            issue_date0   XSD070623A17    01.01.20202   XSD100221A18    05.02.20203   XSD070623T15    10.11.20196   XSD100221T11    12.10.2020任何幫助將不勝感激。
查看完整描述

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

請在更大的數據集上嘗試這個,如果需要任何改進,請告訴我:)


查看完整回答
反對 回復 2023-03-08
?
慕容3067478

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列中的重復項并保留第一個(在我們的例子中)。


查看完整回答
反對 回復 2023-03-08
  • 2 回答
  • 0 關注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號