首页 > 解决方案 > Pandas - 按字符串重新排序列包含概念并在它们之间进行比较

问题描述

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

ID    Name     Gender    Work     BBBB.FullName   BBBB.Sex    BBBB.Occupation
1     Test       M       MIS       Tester             M          GIS

我希望以这种方式重新排序,

  1. 身份证永远是第一位的
  2. 不以 BBBB 开头的第一个可用列
  3. 第一个以 BBBB 开头的可用列
  4. 不以 BBBB 开头的第二个可用列
  5. 以 BBBB 开头的第二个可用列

预期输出 1

ID   Name BBBB.FullName   Gender    BBBB.Sex    BBBB.Work       BBBB.Occupation
1    Test   Tester          M         M           MIS                 GIS

我想将普通列与下一个 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

标签: pythonpandas

解决方案


您可以先将列分为以开头的列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  

推荐阅读