Распечатать двумерную матрицу списка на основе совпадения строк - PullRequest
0 голосов
/ 10 мая 2018

У меня есть список, который я хотел бы выразить в сетке на основе каждой выбранной функции.

breakfast = [['Apple,Banana'],['Apple,Yogurt'],['Banana,Oatmeal']]

Желаемая сетка:

Index:   Apple   Banana   Yogurt   Oatmeal
1         "x"      "x"     " "       " "
2         "x"      " "     "x"       " "
3         " "      "x"     " "       "x"

Я думаю, мне нужно использовать регулярное выражениеи строковое индексирование списка через сетку, как это сделать - мой вопрос.Еще лучше, есть ли библиотека Python, которая делает это автоматически (например, скачки / резюме в R)?

Вот мой текущий код:

def printMatrix(data):
    header = "Index:\tApple\tBanana\tYogurt\tOatmeal"
    print(header)
    for index, value in enumerate(data):
        if str(value).find('Apple') != -1:
            print(index,"\t\'X'", end='')
        else:
            print(index,"\t\' '",end='')
        if str(value).find('Banana') != -1:
            print("\t\'X'", end='')
        else:
            print("\t\' '",end='')
        if str(value).find('Yogurt') != -1:
            print("\t\'X'", end='')
        else:
            print("\t\' '")
        if str(value).find('Oatmeal') != -1:
            print("\t\'X'")

Результаты точны, но эффективность чувствуетсябедные.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы можете использовать чистое решение для панд - сначала создайте Series, затем выберите первое значение списков для скаляров на str[0] и последнее str.get_dummies:

breakfast = [['Apple,Banana', 'Apple,Yogurt'],['Apple,Yogurt'],['Banana,Oatmeal']]

df = pd.Series([','.join(x) for x in breakfast]).str.get_dummies(',')
print (df)
   Apple  Banana  Oatmeal  Yogurt
0      1       1        0       1
1      1       0        0       1
2      0       1        1       0

Ноесли возможно, решение с несколькими значениями списка - сначала list comprehension, сначала join, а затем str.get_dummies:

breakfast = [['Apple,Banana', 'Apple,Yogurt'],['Apple,Yogurt'],['Banana,Oatmeal']]

df = pd.Series([','.join(x) for x in breakfast]).str.get_dummies(',')
print (df)
   Apple  Banana  Oatmeal  Yogurt
0      1       1        0       1
1      1       0        0       1
2      0       1        1       0 
0 голосов
/ 10 мая 2018

Набор, Понимание списка и троичное условие плюс Pandas

Если вы хотите, чтобы Pythonic был красивым, вот один из способов.

import pandas as pd
breakfast = [['Apple,Banana'],['Apple,Yogurt'],['Banana,Oatmeal']]
breakfast = [i[0].split(',') for i in breakfast]


columns=list(set([j for i in breakfast for j in i]))
columns.sort()
values = [[1 if j in i else 0 for j in columns]for i in breakfast]
df = pd.DataFrame(values, columns=columns)
print(df) 

   Apple  Banana  Oatmeal  Yogurt
0      1       1        0       0
1      1       0        0       1
2      0       1        1       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...