Pandas сводная таблица: функция агрегирования по количеству определенной строки - PullRequest
3 голосов
/ 03 мая 2020

Я пытаюсь проанализировать DataFrame, который содержит Date в качестве индекса и Name и Message в качестве столбцов.

df.head () возвращает:

            Name           Message
Date        
2020-01-01  Tom ‎           image omitted
2020-01-01  Michael        ‎image omitted
2020-01-02  James          ‎image Happy new year you wonderfully awfully people...
2020-01-02  James          I was waiting for you ‎image
2020-01-02  James          QB whisperer ‎image

Это сводная таблица, которую я пытался отозвать из исходного df, который aggfun c является подсчетом существования слово (например, изображение)

df_s = df.pivot_table(values='Message',index='Date',columns='Name',aggfunc=(lambda x: x.value_counts()['image']))

, которое в идеале показывалось бы, как пример :

 Name        Tom    Michael   James
 Date                                   
 2020-01-01    1       1        0
 2020-01-02    0       0        3

Например, я сделал еще один df. pivot_table с использованием

df_m = df.pivot_table(values='Message',index='Date',columns='Name',aggfunc=lambda x: len(x.unique()))

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

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Используйте Series.str.count для количества сопоставленных значений для нового столбца, добавленного в DataFrame на DataFrame.assign и затем поворачивающегося с sum:

df_m = (df.reset_index()
          .assign(count= df['Message'].str.count('image'))
          .pivot_table(index='Date', 
                       columns='Name', 
                       values='count' ,
                       aggfunc='sum', 
                       fill_value=0))
print (df_m)
Name        James  Michael  Tom
Date                           
2020-01-01      0        1    1
2020-01-02      3        0    0
1 голос
/ 03 мая 2020

Это для удовольствия, и альтернатива тому же ответу. Это просто игра на различные варианты Pandas обеспечивает:

      #or df1.groupby(['Date','Name']) if the index has a name
res = (df1.groupby([df1.index,df1.Name])
          .Message.agg(','.join)
          .str.count('image')
          .unstack(fill_value=0)
      )

res

Name      James   Michael   Tom ‎
Date            
2020-01-01  0       1        1
2020-01-02  3      0         0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...