как преобразовать столбец Final_Unique в значения заголовка в pandas - PullRequest
1 голос
/ 17 февраля 2020

образец изображения для проверки данных

ОБРАЗЦЫ ДАННЫХ

Actual_Data     Final_Unique
8,8,8,8,8,8,        8,8
6,7,7,7,6,7,        6,7
2,12,3,4,12,12,     7,7
14,14,14,14,14,14,  7,6
1,1,12,2,2,4,       2,12
6,8,8,8,8,12,       12,3
6,6,6,6,3,14,       3,4
1,14,14,1,1,2,      4,12
1,1,1,1,1,14,       12,12

Я пытаюсь это

newdf = a.pivot (index = 'Actual_Data', columns = 'Final_Unique')

у меня есть 2 столбца фактических данных и final_unique в фактическом у меня 44000 строк, а final_unique имеет 266 строк, я хочу получить 266 столбцов и фактические данные остаются такими же, как они, и подсчитывают, сколько раз фактические данные появляются в заголовке

ошибка при получении

дублированные данные существуют, невозможно изменить форму

ожидаемый вывод

ACTUAL DATA          8,8  6,7  7,7   7,6  2,12

8,8,8,8,8,8,          3   0    0      0    0

6,7,7,7,6,7,          0    2    1     1    0

2,12,3,4,12,12,       0    0    0     0    1

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

pivot_table разрешает функцию агрегирования, поэтому, если вы добавите только столбец, содержащий 1, к вашему фрейму данных, вы можете получить ожидаемый результат:

newdf = a.assign(val=1).pivot_table(values='val', index='Actual_Data',
                                    columns='Final_Unique', aggfunc=sum, fill_value=0
                                    ).reset_index().rename_axis(None, axis=1)

С примерами данных, которые он дает:

          Actual_Data  12,12  12,3  2,12  3,4  4,12  6,7  7,6  7,7  8,8
0       1,1,1,1,1,14,      1     0     0    0     0    0    0    0    0
1       1,1,12,2,2,4,      0     0     1    0     0    0    0    0    0
2      1,14,14,1,1,2,      0     0     0    0     1    0    0    0    0
3  14,14,14,14,14,14,      0     0     0    0     0    0    1    0    0
4     2,12,3,4,12,12,      0     0     0    0     0    0    0    1    0
5       6,6,6,6,3,14,      0     0     0    1     0    0    0    0    0
6        6,7,7,7,6,7,      0     0     0    0     0    1    0    0    0
7       6,8,8,8,8,12,      0     1     0    0     0    0    0    0    0
8        8,8,8,8,8,8,      0     0     0    0     0    0    0    0    1

Из ваших комментариев два столбца исходного a кадра данных не связаны напрямую, а фактически представляют собой две независимые серии, и вы просто хотите узнать, сколько раз Final_Unique значение встречается в Actual_Data единица.

Этот код должен дать его:

newdf = a[['Actual_Data']]
for col in set(a['Final_Unique'].dropna()):
    newdf[col] = newdf.Actual_Data.str.findall('(^|,)'+col+'(?=,)').apply(len)

Результат:

          Actual_Data  8,8  12,3  12,12  7,7  2,12  6,7  4,12  3,4  7,6
0        8,8,8,8,8,8,    3     0      0    0     0    0     0    0    0
1        6,7,7,7,6,7,    0     0      0    1     0    2     0    0    1
2     2,12,3,4,12,12,    0     1      1    0     2    0     1    1    0
3  14,14,14,14,14,14,    0     0      0    0     0    0     0    0    0
4       1,1,12,2,2,4,    0     0      0    0     0    0     0    0    0
5       6,8,8,8,8,12,    2     0      0    0     0    0     0    0    0
6       6,6,6,6,3,14,    0     0      0    0     0    0     0    0    0
7      1,14,14,1,1,2,    0     0      0    0     0    0     0    0    0
8       1,1,1,1,1,14,    0     0      0    0     0    0     0    0    0

Обоснование приведенного выше кода: :

  • вычисляет список столбцов из столбцов Final_Unique: set автоматически удаляет дубликаты (но нарушает порядок), а dropna() удаляет пустые значения
  • создайте новый фрейм данных из столбца Actual_Data.
  • добавьте к этому фрейму данных столбцы из списка, вычисленного на предыдущем шаге, и для каждого столбца
    • используйте str.findall и соответствующее регулярное выражение для поиска перекрывающаяся последовательность, содержащая имя столбца после запятой или в начале строки, за которым следует запятая - последняя запятая не включена в сопоставляемую строку для правильного подсчета последовательных последовательностей, поэтому (?=...)
    • применяет функцию len преобразовать этот список в простой счет
0 голосов
/ 17 февраля 2020

Я бы сделал следующее:

import re
l1 = list(a['Actual_Data'])
l2 = list(a['Final_Unique'])
d = {i: [len(re.findall(i,j)) for j in l1] for i in l2}
newdf = pd.DataFrame(d,index=l1)

, если у вас есть проблема с типами данных:

import re
l1 = list(a['Actual_Data'])
l2 = list(a['Final_Unique'])
d = {i: [len(re.findall(str(i),str(j))) for j in l1] for i in l2}
newdf = pd.DataFrame(d,index=l1)

То, что я здесь сделал, принудительно заставляет каждое значение Actual_Data и Final_Unqiue в строку.

...