【问题标题】:Python sorting values and grouping them based on unique keysPython对值进行排序并根据唯一键对它们进行分组
【发布时间】:2019-09-28 00:00:54
【问题描述】:

我有一个元组元素列表,如下所示。我想将元素分组为多维行和列。例如:

说列表是“列表”:

[("Adam", "DeltaAir"),
("Bianca", "AlaskanAir"),
("Romeo", "DeltaAir"),
("Danaerys", "DragonAir"),
("Jon", "DragonAir"),
("Walter", "AlaskanAir")]

我想将此列表打印为:

------------------------------------------
Name  | AlaskanAir | DeltaAir | DragonAir
------------------------------------------
Adam                    *
Bianca      *
Romeo                   *
Danaerys                            *
Jon                                 *
Walter      *
------------------------------------------

我开始的目的是首先找到我想要作为行标题的所有唯一元素。

    row=[]
    for i in list:
        row.append(i[1])
    row = list(set(row))

然后我会遍历“行”中的元素,然后建立表格。我怎样才能轻松构建它? 谢谢!

【问题讨论】:

    标签: python arrays list sorting multiple-columns


    【解决方案1】:

    我们可以使用pandas:

    import pandas as pd
    
    df = pd.DataFrame([("Adam", "DeltaAir"),
    ("Bianca", "AlaskanAir"),
    ("Romeo", "DeltaAir"),
    ("Danaerys", "DragonAir"),
    ("Jon", "DragonAir"),
    ("Walter", "AlaskanAir")], columns=['name', 'value'])
    
    result = pd.get_dummies(df, columns=['value']).rename(columns={f'value_{col}': col for col in df['value'].unique()}).replace({col: {0: '', 1: '*'} for col in df['value'].unique()})
    
    print(result)
    

    输出:

           name AlaskanAir DeltaAir DragonAir
    0      Adam                   *          
    1    Bianca          *                   
    2     Romeo                   *          
    3  Danaerys                             *
    4       Jon                             *
    5    Walter          *                   
    

    这会将对应于每个个体的值转换为相关列中的 1 或 0。然后,我们只需将 1 替换为 * 并将 0 替换为空字符串。

    注意pandas对于逻辑不是必须的,可以很简单,但是方便表格的对齐。

    【讨论】:

      【解决方案2】:
      lst = [("Adam", "DeltaAir"),
      ("Bianca", "AlaskanAir"),
      ("Romeo", "DeltaAir"),
      ("Danaerys", "DragonAir"),
      ("Jon", "DragonAir"),
      ("Walter", "AlaskanAir")]
      
      #Create pandas DataFrame with the names from the list
      df = pd.DataFrame([elem[0] for elem in lst], columns=["Name"])
      #Iterate over a set (unique values) of character properties (DeltaAir, AlaskanAir, DragonAir) 
      for elem in set([elem[1] for elem in lst]):
          #make a list containing spaces or *'s for every character in the list
          #depending on the property we are just iterating over and add that list 
          # as a column to the DataFrame
          df[elem] = ["*" if item[1] == elem else " " for item in lst] 
      

      编辑您的评论:

      您可以使用 groupby 和聚合按名称组合值(如果这不是您的意思,请澄清)。

      df.reindex(sorted(df.columns))
      df2 = pd.DataFrame(sorted(list(df["Name"].unique())), columns = ["Name"])
      for elem in set([elem[1] for elem in lst]):   
          df2[elem] = list(df.groupby(['Name'])[elem].agg(lambda x: "*" if "*" in x.values else " "))
      

      添加更多信息

      谢谢弗洛里安。我的意思是如果有像下面这样的重复名称,它应该适当地填充相应的航空公司行。例如:亚当和罗密欧出现两次就像,而不是同名有两个单独的行。

      [("Adam", "DeltaAir"),
      ("Bianca", "AlaskanAir"),
      ("Romeo", "DeltaAir"),
      ("Danaerys", "DragonAir"),
      ("Jon", "DragonAir"),
      ("Walter", "AlaskanAir"),
      ("Adam", "AlaskanAir"),
      ("Romeo", "DragonAir")]
      
      ------------------------------------------
      Name  | AlaskanAir | DeltaAir | DragonAir
      ------------------------------------------
      Adam        *           *
      Bianca      *
      Romeo                   *           *
      Danaerys                            *
      Jon                                 *
      Walter      *
      ------------------------------------------
      

      【讨论】:

      • df = pd.DataFrame([elem[7] for elem in plan], columns=["Name"]) - 制作这个“[elem[7] for elem in plan]" 只显示唯一值?例如:df = pd.DataFrame(set([elem[7] for elem in plan]), columns=["Name"])
      • 我的意思是,你能不能也让“名字”唯一,所以如果有两个亚当,* 落在相应的行吗? @Florian H。谢谢。
      • 在运行上述代码时,我也收到此错误 "raise KeyError("Column not found: %s" % key)"。
      • 你确定这是来自上面的代码吗?你用的是什么python版本?
      • 我认为我在尝试理解代码和重写时犯了一个错误。它完美地运作弗洛里安!
      猜你喜欢
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 2021-02-07
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      相关资源
      最近更新 更多