Python сортирует значения и группирует их по уникальным ключам - PullRequest
2 голосов
/ 10 мая 2019

У меня есть список элементов кортежа, как показано ниже.Я хочу сгруппировать элементы в многомерный ряд и столбец.Например:

скажем, что список является "списком":

[("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))

Затем я перебрал бы элементы в «строке», а затем построил таблицу.Как я могу легко построить это?Спасибо!

Ответы [ 2 ]

3 голосов
/ 10 мая 2019

Мы можем сделать это с помощью 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 голосов
/ 10 мая 2019
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      *
------------------------------------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...