【问题标题】:Duplicate like, different end python重复,不同的结束python
【发布时间】:2020-03-17 07:35:28
【问题描述】:

我以前问过这个问题,没有得到正确的答案,现在尝试不同。

例如: 如果我有一个名为A45-443-FGH-02A 的列和另一个名为A45-443-FGH-02B 的列。它们是“重复的”,但末尾有不同的字母。 我只需要选择最后带有 B 的这些,如果列名最后有“A”,则必须将其删除。 我想按长度选择,但没有成功。

【问题讨论】:

  • 您能否创建一个工作示例,其中包含要测试的数据和要验证的预期输出。

标签: pandas duplicates multiple-columns


【解决方案1】:

删除以A 结尾的重复列名,如果不重复则不重复:

c = ['A45-443-FGH-02A','A45-443-FGH-02B','B45-02A']

df = pd.DataFrame(columns=c)
print (df)
Empty DataFrame
Columns: [A45-443-FGH-02A, A45-443-FGH-02B, B45-02A]

m1 = df.columns.str[:-1].duplicated(keep=False)
m2 = df.columns.str.endswith('A')

df = df.loc[:, (m1 & ~m2) | ~m1]
print (df)
Empty DataFrame
Columns: [A45-443-FGH-02B, B45-02A]
Index: []

如果使用 A 之类的列:

c = ['A45-443-FGH-02A','A45-443-FGH-02B','B45-02A']

df = pd.DataFrame({'A':c})
print (df)
                 A
0  A45-443-FGH-02A
1  A45-443-FGH-02B
2          B45-02A

m1 = df.A.str[:-1].duplicated(keep=False)
m2 = df.A.str.endswith('A')

df = df[(m1 & ~m2) | ~m1]
print (df)
                 A
1  A45-443-FGH-02B
2          B45-02A

【讨论】:

    【解决方案2】:

    假设您在 A 和 B 之间进行了检查,并且您只需要 B 的属性。

    df.loc[df['yourColumnName'].apply(lambda x: x.endswith('B'))]
    

    【讨论】:

    • 谢谢,这将一一工作,但如果我需要在表中找到所有“重复的喜欢”?
    【解决方案3】:

    IIUC:

    df = pd.DataFrame(columns=["A45-443-FGH-02B","A45-443-FGH-02A","ABC","CDE"])
    
    s = df.columns.sort_values()
    
    print (df[[i[-1] for i in s.groupby(s.str[:-1]).values()]])
    
    #
    Empty DataFrame
    Columns: [A45-443-FGH-02B, ABC, CDE]
    Index: []
    

    【讨论】:

    • 我认为问题不是以A 结尾,所以如果不同的数据会像df = pd.DataFrame(columns=["A45-443-FGH-02B","A45-443-FGH-02C","ABC","CDE"]) 一样失败
    • 我试图制定一个通用的解决方案来保留最后一个相似的列 - 但是是的,它可能合适也可能不合适。如果他提供样本数据和输出就更好了。
    • 是的,OP 需要删除 AB 结束数据,您的解决方案工作方式不同,所以添加评论
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 2020-05-19
    • 2019-12-22
    • 1970-01-01
    • 2020-07-28
    相关资源
    最近更新 更多