Сколько раз строковое значение ячейки повторяется в другом столбце фрейма данных pandas?

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я пытаюсь выяснить, сколько раз значение каждой ячейки столбца A появляется во всех ячейках другого столбца B, используя pandas. например, для значения ячейки A1 нам нужно просмотреть ВПР его значение во всех ячейках столбца B и выяснить, во скольких ячейках столбца B оно повторяется, а затем сопоставить с ним значение count в столбце C. Я проверил все возможные решения, такие как использование contains, extract, groupby и т.д., Но никакого результата. кроме того, значение в столбце B не имеет специального текстового шаблона, который можно определить в коде.

Это то, что у меня есть в качестве фрейма данных:

       A                            B                                C
 ============  ===============================================  ========
   T4561                                      T4561 (KHO ZAD)
   E2962                     E2962 (Bat - Rouchan),T5362(asw)
  DT2172                 T2172 (Masd),T2117 (Masd),T4561(fsd)
   T6096              T6096 (Mara),H1005 (BAHH), H1049 (QIEH)
   T5362                 T5362 (SYMI (ABAI)),E0993,E7523(pwd)
   E0993                       E0993 (Tean),T4561,E0993(ssdc)
   E1834                        E1834 (Ahaz),T5362,E0993(sdw)
   T2844  T2844 (Varmn),T3798 (QASIN), T3596 (Vara),T4561(qw)
   E7523                              E7523 (Sabk),E0993(bbz)
   T9062                        T9062 (Shrz),T5362,E7523(fgf)
  

И это то, что мне нужно:

       A                            B                                C
 ============  ===============================================  ========
       T4561                                      T4561 (KHO ZAD)  4
       E2962                     E2962 (Bat - Rouchan),T5362(asw)  1
      DT2172                 T2172 (Masd),T2117 (Masd),T4561(fsd)  0
       T6096              T6096 (Mara),H1005 (BAHH), H1049 (QIEH)  1
       T5362                 T5362 (SYMI (ABAI)),E0993,E7523(pwd)  4
       E0993                       E0993 (Tean),T4561,E0993(ssdc)  5
       E1834                        E1834 (Ahaz),T5362,E0993(sdw)  1
       T2844  T2844 (Varmn),T3798 (QASIN), T3596 (Vara),T4561(qw)  1
       E7523                              E7523 (Sabk),E0993(bbz)  3
       T9062                        T9062 (Shrz),T5362,E7523(fgf)  1
  

Комментарии:

1. В ожидаемом результате количество для T5362 должно быть 4 , а для DT2172 должно быть 0 .

2. да, спасибо. исправлено.

Ответ №1:

Используйте Series.str.extractall вместе с шаблоном регулярных выражений, затем используйте Series.value_counts для вычисления частоты, затем используйте Series.map для сопоставления значений в столбце A с соответствующими частотами:

 m = df['B'].str.extractall(f"({'|'.join(df['A'])})")[0].value_counts()
df['C'] = df['A'].map(m).fillna(0)
  

Результат:

         A                                                    B    C
0   T4561                                      T4561 (KHO ZAD)  4.0
1   E2962                     E2962 (Bat - Rouchan),T5362(asw)  1.0
2  DT2172                 T2172 (Masd),T2117 (Masd),T4561(fsd)  0.0
3   T6096              T6096 (Mara),H1005 (BAHH), H1049 (QIEH)  1.0
4   T5362                 T5362 (SYMI (ABAI)),E0993,E7523(pwd)  4.0
5   E0993                       E0993 (Tean),T4561,E0993(ssdc)  5.0
6   E1834                        E1834 (Ahaz),T5362,E0993(sdw)  1.0
7   T2844  T2844 (Varmn),T3798 (QASIN), T3596 (Vara),T4561(qw)  1.0
8   E7523                              E7523 (Sabk),E0993(bbz)  3.0
9   T9062                        T9062 (Shrz),T5362,E7523(fgf)  1.0