Есть ли в pandas функция, которая поможет мне подсчитать каждую строку из каждого списка строк? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть такой фрейм данных:

df1
   a  b  c
0  1  2  [bg10, ng45, fg56]
1  4  5  [cv10, fg56]
2  7  8  [bg10, ng45, fg56]
3  7  8  [fg56, fg56]
4  7  8  [bg10]

Я хотел бы подсчитать всего вхождений каждого типа в столбце 'c '. Затем я хотел бы вернуть значение столбца «b» для значений в столбце «c», общее количество которых равно «1».

Ожидаемый результат примерно такой:

           c    b   total_count
    0   bg10    2   2
    0   ng45    2   2
    0   fg56    2   5
    1   cv10    5   1
    1   fg56    5   5

Я пробовал библиотеку 'Коллекции' и 'для' l oop (я понимаю, что это не лучшая практика в Pandas), но я думаю, что мне не хватает некоторых фундаментальных знаний о списках внутри ячеек , и как проводить подобный анализ.

Спасибо, что приняли во внимание мой вопрос.

1 Ответ

0 голосов
/ 06 августа 2020

Я бы применил следующий способ:

сначала я создаю df:

df1=pd.DataFrame({"b":[2,5,8,8], "c":[['bg10', 'ng45', 'fg56'],['cv10', 'fg56'],['bg10', 'ng45', 'fg56'],['fg56', 'fg56']]})

следующее использование применяется для подсчета количества (не уникальных) элементов в списке и сохранения это в другом столбце:

df1["count_c"]=df1.c.apply(lambda x: len(x))

вы получите следующее:

     b             c        count_c
  0  2  [bg10, ng45, fg56]        3
  1  5        [cv10, fg56]        2
  2  8  [bg10, ng45, fg56]        3
  3  8        [fg56, fg56]        2

, чтобы получить строки, когда c больше порогового значения: `

df1[df1["count_c"]>2]["b"]

примечание: если вы хотите подсчитывать только уникальные значения в каждом списке в столбце c, вы должны использовать:

df1["count_c"]=df1.c.apply(lambda x: len(set(x)))

ИЗМЕНИТЬ

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

new_df1=(df1.c.apply(lambda x: pd.Series(x))).stack().reset_index(level=1,drop=True).to_frame("c").join(df1[["b"]],how="left")

, а затем получим общее количество каждого элемента. в списке и добавьте его в новый столбец:

  counts_dict=new_df1.c.value_counts().to_dict()
  new_df1["total_count_c"]=new_df1.c.map(counts_dict)
  new_df1.head()
  
           c    b   total_count_c
    0   bg10    2   2
    0   ng45    2   2
    0   fg56    2   5
    1   cv10    5   1
    1   fg56    5   5
  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...