Python 熊猫-按字符串对列重新排序包含概念并在它们之间进行比较

Python 熊猫-按字符串对列重新排序包含概念并在它们之间进行比较,python,pandas,Python,Pandas,我有一个像这样的熊猫数据框 ID Name Gender Work BBBB.FullName BBBB.Sex BBBB.Occupation 1 Test M MIS Tester M GIS 我想把它改成这样 我总是第一 不以BBBB开头的第一个可用列 以BBBB开头的第一个可用列 不以BBBB开头的第二个可用列 第二个可用列以BBBB开头 预期产出1 ID N

我有一个像这样的熊猫数据框

ID    Name     Gender    Work     BBBB.FullName   BBBB.Sex    BBBB.Occupation
1     Test       M       MIS       Tester             M          GIS
我想把它改成这样

  • 我总是第一
  • 不以BBBB开头的第一个可用列
  • 以BBBB开头的第一个可用列
  • 不以BBBB开头的第二个可用列
  • 第二个可用列以BBBB开头
  • 预期产出1

    ID   Name BBBB.FullName   Gender    BBBB.Sex    BBBB.Work       BBBB.Occupation
    1    Test   Tester          M         M           MIS                 GIS
    
    我想比较normal列和下一个BBBB列,并插入一个列作为True或False

    预期产出2

    ID   Name BBBB.FullName   Result_Name Gender    BBBB.Sex  Result_Gender   BBBB.Work       BBBB.Occupation  Result_Work
    1    Test    Tester       False        M          M          True           GIS            MIS                False
    

    您可以首先将列分为以
    BBBB.
    开头的列和不以
    开头的列

    standard_cols = [x for x in df.columns if not x.startswith("BBBB.") and x != "ID"]
    b_cols = [x for x in df.columns if x.startswith("BBBB.")]
    
    我们可以将它们成对地转换,然后为每一对创建一个结果列,同时构建一个列表,该列表捕获我们想要的顺序,以便在末尾显示列

    result_column_order = ["ID"]
    
    for plain_col, b_col in zip(standard_cols, b_cols):
        res_name = plain_col + "_Result"
        df[res_name] = df[plain_col] == df[b_col]
        result_column_order.extend([plain_col, b_col, res_name])
    
    然后按所需顺序返回:

    df[result_column_order]
    
    返回下面的

       ID  Name BBBB.FullName  Name_Result Gender BBBB.Sex  Gender_Result Work  \
    0   1  Test        Tester        False      M        M           True  MIS   
    
      BBBB.Occupation  Work_Result  
    0             GIS        False  
    

    老实说,如果您愿意在合并前使用后缀并重命名一帧中的列,我认为您可以极大地简化您的生活。排序使所有内容彼此相邻很简单,列stubnames上的一个groupby为所有成对的组获取
    结果
    列。使用
    'ID'
    作为索引在这一点上可能是一个不错的主意。@ALollz是这门语言的新蜜蜂。所以,我在这里进行实验和学习。非常感谢。