Есть ли в Pandas способ подсчитать (Countifs in excel) в одном кадре данных и добавить счетчики как новый столбец в другом кадре данных другой длины? - PullRequest
0 голосов
/ 31 декабря 2018

Я перевожу формулу Excel в пандах.У меня есть два кадра данных df1 и df2, и мне нужно будет посчитать значения в первом столбце данных df1 и заполнить кадр данных df2, где значения, подсчитанные в df1, равны значению в df2,Как проверить и заполнить новый столбец в df2 подсчитанными значениями от df1?

df1:

      id      member        seq
0   48299      Koif          1
1   48299      Iki           1
2   48299      Juju          2
3   48299      PNik          3 
4   48865      Lok           1 
5   48865      Mkoj          2
6   48865      Kino          1
7   64865      Boni          1
8   64865      Afriya        2
9   50774      Amah          2
10  23697      Pilato        1
11  23697      Clems         1

df2:

   group_id      group_name    count
0   48299      e_sys          
1   50774      Y3N
2   64865      nana
3   48865      juzti

Могут быть члены из df1, например, Clems и Pilato, чей счет не нужен, так как эта группа не входит в df2.

Я могу сделать подсчет в порядке (см.код ниже), моя проблема заключается в сравнении подсчитанных id в df1 с group_id в df2 и заполнении подсчитанных значений.

Подсчет:

 df1.groupby('id')['id'].count()

Мое текущее решениеis:

df2['count'] = df1[(df2['group_id'].isin(df1['id']))].count() Or

df2['count'] = df1[(df2['group_id'].isin(df1['id']))].transform('count')

Оба не дают желаемого результата.

Результаты df2:

   group_id      group_name    count
0   48299      e_sys              4
1   50774      Y3N                1
2   64865      nana               2
3   48865      juzti              3

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Использование map от Series:

df2['count'] = df2['group_id'].map(df1.groupby('id')['id'].count())

Альтернатива с Series.value_counts:

df2['count'] = df2['group_id'].map(df1['id'].value_counts())

print (df2)
   group_id group_name  count
0     48299      e_sys      4
1     50774        Y3N      1
2     64865       nana      2
3     48865      juzti      3
0 голосов
/ 31 декабря 2018

Объедините два кадра данных, используя левое соединение:

counts = df1.groupby('id').size().reset_index()
df2.merge(counts, how='left', left_on='group_id', right_on='id')

Вывод:

 #      group_id group_name     id  0
 #   0     48299      e_sys  48299  4
 #   1     50774        Y3N  50774  1
 #   2     64865       nana  64865  2
 #   3     48865      juzti  48865  3

При левом соединении сохраняются только те числа, которые отображаются в df2.Заметьте, что я использовал groupby().size() как несколько более четкую и краткую версию подсчета.

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