Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python排序值并基于唯一键对其进行分组_Python_Arrays_List_Sorting_Multiple Columns - Fatal编程技术网

Python排序值并基于唯一键对其进行分组

Python排序值并基于唯一键对其进行分组,python,arrays,list,sorting,multiple-columns,Python,Arrays,List,Sorting,Multiple Columns,我有一个元组元素列表,如下所示。我想将元素分组到多维行和多维列中。例如: 将列表称为“列表”: 我想将此列表打印为: ------------------------------------------ Name | AlaskanAir | DeltaAir | DragonAir ------------------------------------------ Adam * Bianca * Romeo

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

将列表称为“列表”:

我想将此列表打印为:

------------------------------------------
Name  | AlaskanAir | DeltaAir | DragonAir
------------------------------------------
Adam                    *
Bianca      *
Romeo                   *
Danaerys                            *
Jon                                 *
Walter      *
------------------------------------------
我首先要做的是找到我想要作为行标题的所有唯一元素

    row=[]
    for i in list:
        row.append(i[1])
    row = list(set(row))
然后我将遍历“行”中的元素,然后构建表。我怎样才能轻松地构建它?
谢谢

我们可以使用
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
对于逻辑不是必需的,这可以简单地完成,但它便于表的对齐

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和aggregate按名称获取值(如果这不是您的意思,请澄清)

添加更多信息

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

[("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]表示计划中的元素),columns=[“Name”])-使此“[elem[7]表示计划中的元素]”列表仅显示唯一值的最佳方法是什么?例如:df=pd.DataFrame(set([elem[7]表示平面中的elem]),columns=[“Name”])我的意思是,您是否也可以使“Name”唯一,因此如果有两个Adams,则*落在相应的行中@Florian H.谢谢。在运行上述代码时,我也会收到此错误“raise KeyError”(“找不到列:%s”%key)。您确定这来自上述代码吗?你使用什么python版本?我想我在试图理解代码和重写时犯了一个错误。它在佛罗里达州工作得很好!
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      *
------------------------------------------