панды создают таблицу уникальных значений другого df

Я пытаюсь создать таблицу (чтобы распечатать ее в LaTex после), содержащую все разные значения данного DataFrame:

dfDiff = pd.DataFrame(columns=df2.columns)
for col in df2:
    dfDiff[col]=(df2[col].unique())

У меня есть это сообщение об ошибке:

ValueError: Length of values does not match length of index

есть ли лучший способ сделать это?


person enden    schedule 08.02.2017    source источник
comment
Если у вас нет одинакового количества уникальных значений в каждом столбце, например. у вас есть ровно 10 уникальных значений в каждом столбце, это не удастся из-за выравнивания. Как должен выглядеть желаемый df?   -  person EdChum    schedule 08.02.2017
comment
мой df2 содержит разные столбцы (род занятий, пол, язык...), поэтому у меня нет одинакового уникального значения в каждом столбце, поэтому я борюсь с этой проблемой   -  person enden    schedule 08.02.2017
comment
Я изо всех сил пытаюсь понять, чего, по моему мнению, вы пытаетесь достичь. Можете ли вы предоставить пример ввода и желаемый результат? Вы ищете уникальные строки (как в комбинациях столбцов)? Потому что, если вы на самом деле ищете уникальные значения в каждом столбце, какое значение добавляет структура DataFrame по сравнению с просто наличием списков (или серий) уникальных записей в каждом столбце? Кажется, отношения между значениями не важны для вас. Для меня может быть слишком рано утром, но я не могу найти никакого применения для запрошенного вывода.   -  person Plasma    schedule 09.02.2017


Ответы (2)


Хорошо, похоже, ваша цель — иметь второй DataFrame с тем же количеством и именем столбцов, где каждый столбец содержит уникальные значения исходного DataFrame. Я не знаю, лучший ли это способ сделать это, поэтому я покажу вам, как я бы сделал это по-вашему, а затем предложу другой способ красиво напечатать это.

Как уже упоминалось, ошибка, которую вы получаете, связана с тем, что вы пытаетесь создать DataFrame со столбцами разной длины. Вы можете сделать это с некоторой ловкостью, если у вас все в порядке со значениями NaN в «пустых» ячейках. Я бы подошел к этому так:

  1. Получите имена столбцов и сохраните их в списке.
  2. Создайте список для хранения уникальных значений из каждого столбца df2 в виде новой серии.
  3. Итерация по имени каждого столбца, сохраняя новую серию уникальных значений каждого столбца.
  4. Выясните, какой столбец является самым длинным, и создайте пустой (заполненный NaN) DataFrame на основе количества столбцов и самого длинного списка уникальных значений.
  5. Наконец, замените возможные значения NaN фактическими значениями и распечатайте DF.

    import pandas as pd
    
    colNames = df2.columns.tolist()
    uniqueValsList = []                    
    
    for each in colNames:
        uniqueVals = list(df2[each].unique())
        uniqueValsList.append(pd.Series(data=uniqueVals,name=each))
    
    maxlen = 0
    for each in uniqueValsList:
        if len(each) > maxlen:
            maxlen = len(each)
    
    fillerData = np.empty((maxlen,len(colNames),))
    dfDiff = pd.DataFrame(columns=colNames,data=fillerData)
    
    for i in range(len(uniqueValsList)):
        dfDiff[colNames[i]] = uniqueValsList[i]
    dfDiff
    

Это позволит вам распечатать DF с вашими уникальными значениями, но это будет выглядеть странно со всеми значениями NaN. Я бы рекомендовал сделать это с помощью HTML и модуля tabulate, как в этом ответе. Например:

    from IPython.display import HTML, display
    import tabulate

    listOfLists = []
    for i in range(len(uniqueValsList)):
        thisList = []
        thisList.append(colNames[i])
        for each in uniqueValsList[i].tolist():
            thisList.append(each)
        listOfList.append(thisList)

    display(HTML(tabulate.tabulate(listOfLists, tablefmt='html')

Я не знаком с LaTeX в Jupyter Notebooks, поэтому, если вы нашли лучший способ сделать это, мне было бы интересно узнать! Я пытался возиться со значениями tablefmt в вызове display(HTML()), но безрезультатно.

person DangerousDave    schedule 26.05.2018

эта функция возьмет массив, заполненный несколькими переменными (которые, вероятно, будут повторяться более одного раза), и вернет массив, который имеет только уникальные переменные, например, если вход = [cc, ba, aa, aa, ab, ab] выход будет [cc,ba,aa,ab]

> def unique(tu):
>     t=tu
>     i=0
>     while i< len(t) :
>          test=0
>          for j in range(len(tu)):
>              if t[i]==tu[j]:
>                  test+=1
>          if test > 1: 
>            for k in range(test-1)  :
>                  del t[i+k]
>                  i-=1
>          i+=1       
>                 
>     return t

> yy=["bb","ba","aa","aa","aa","ab","ab"] ul=unique(yy)                 
> for i in range(len(ul)):
>     print(ul[i])

  
person Bahachairet    schedule 05.07.2021
comment
Спасибо за ответ. Не могли бы вы отредактировать свой ответ, чтобы включить объяснение вашего кода? Это поможет будущим читателям лучше понять, что происходит, и особенно тем членам сообщества, которые плохо знакомы с языком и пытаются понять концепции. - person Jeremy Caney; 06.07.2021
comment
(код, который запускается при вставке в интерпретатор Python, кажется предпочтительным.) - person greybeard; 06.07.2021
comment
@JeremyCaney спасибо за ваш комментарий, но на самом деле я новичок в переполнении стека. Я искал функцию, которая берет массив, заполненный несколькими переменными (которые, вероятно, будут повторяться более одного раза), и возвращает массив, который имеет только уникальные переменные, например, если ввод = [cc,ba,aa,aa,ab,ab] вывод будет [cc,ba,aa,ab] - person Bahachairet; 07.07.2021