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

我在熊猫中有这个数据框:


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_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

如您所见,“债券”列中某些值的前 9 个字符相同。我将得到这个数据框的一个子集,对于第 10 个字符等于“A”的每个值,我想得到前 9 个字符相同且第 10 个字符等于“T”的值。之后,如果“A”和“T”债券的发行日期不同,那么我想过滤这两种债券。


例如,第 0 个索引的债券值与第 3 个和第 4 个索引的值具有相同的模式,但第 0 个和第 4 个索引的发行日期相同,所以我想过滤第 0 行和第 3 行。另一方面,第一个指数的债券价值与第五个指数具有相同的模式,但它们的发行日期相同,所以我不想过滤它们。


毕竟,我想获得以下数据框:


    bond            issue_date

0   XSD070623A17    01.01.2020

2   XSD100221A18    05.02.2020

3   XSD070623T15    10.11.2019

6   XSD100221T11    12.10.2020

任何帮助将不胜感激。


守候你守候我
浏览 116回答 2
2回答

鸿蒙传说

这是一个不需要任何硬编码的答案。第一步:按应该相等的前 9 个字符以及 issue_date 分组。实际上,您不需要考虑 A 或 T 是第 10 个字符的情况。做出了以下假设:索引无关紧要当债券的前 9 个字符相同时:仅保留第一次出现df_grouped = (df.groupby([df.bond.str[:9], df.issue_date])                .agg({'bond': ['first', 'nunique']}))                                  bond                     first        nuniquebond      issue_date  XSD070623 01.01.2020 XSD070623A17 2XSD070623 10.11.2019 XSD070623T15 1XSD090222 03.05.2020 XSD090222A10 2XSD100221 05.02.2020 XSD100221A18 1XSD100221 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        nunique0 XSD070623 01.01.2020 XSD070623A17 2.01 XSD070623 10.11.2019 XSD070623T15 1.02 XSD100221 05.02.2020 XSD100221A18 1.03 XSD100221 12.10.2020 XSD100221T11 1.0最后一步:保留有用的列df_grouped[['first', 'issue_date']].rename(columns={'first': 'bond'})  first issue_date0 XSD070623A17 01.01.20201 XSD070623T15 10.11.20192 XSD100221A18 05.02.20203 XSD100221T11 12.10.2020请在更大的数据集上尝试这个,如果需要任何改进,请告诉我:)

慕容3067478

我们可以在此处使用正则表达式,df['bond'].str.contains()因为您只需要带有XSD070623or的行XSD100221,并且还想删除具有相同值的行issue-date。这是我所做的:#your df:>>> 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现在应用正则表达式来满足列的第一个条件bond并删除issue-date列的重复项并考虑第一个,我做了:>>> df[df['bond'].str.contains('XSD070623|XSD100221')].drop_duplicates(subset='issue_date', keep="first")           bond  issue_date0  XSD070623A17  01.01.20202  XSD100221A18  05.02.20203  XSD070623T15  10.11.20196  XSD100221T11  12.10.2020以上'XSD070623|XSD100221'将被视为正则表达式,我们将删除issue-date列中的重复项并保留第一个(在我们的例子中)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python