У меня есть Dataframe, который выглядит как показано ниже

data = [(datetime.datetime(2021, 2, 10, 7, 49, 7, 118658), u'12.100.90.10', u'100.100.12.1', u'LT_DOWN'),
       (datetime.datetime(2021, 2, 10, 7, 49, 14, 312273), u'12.100.90.10', u'100.100.12.1', u'LT_UP'),
       (datetime.datetime(2021, 2, 10, 7, 49, 21, 535932), u'12.100.90.10', u'100.100.12.1', u'LT_UP'),
       (datetime.datetime(2021, 2, 10, 7, 50, 28, 725961), u'12.100.90.10', u'100.100.12.1', u'PL_DOWN'),
       (datetime.datetime(2021, 2, 10, 7, 50, 32, 450853), u'10.100.80.10', u'10.55.10.1', u'PL_LOW'),
       (datetime.datetime(2021, 2, 10, 7, 51, 32, 450853), u'10.10.80.10', u'10.55.10.1', u'MA_HIGH'),
       (datetime.datetime(2021, 2, 10, 7, 52, 34, 264042), u'10.10.80.10', u'10.55.10.1', u'PL_DOWN')]

Как видите, данные регистрируются за минуту. Я только что представил здесь часть полных данных.

Вот как это выглядит при загрузке в пандах

                        date         start           end     type
0 2021-02-10 07:49:07.118658  12.100.90.10  100.100.12.1  LT_DOWN
1 2021-02-10 07:49:14.312273  12.100.90.10  100.100.12.1    LT_UP
2 2021-02-10 07:49:21.535932  12.100.90.10  100.100.12.1    LT_UP
3 2021-02-10 07:50:28.725961  12.100.90.10  100.100.12.1  PL_DOWN
4 2021-02-10 07:50:32.450853  10.100.80.10    10.55.10.1   PL_LOW
5 2021-02-10 07:51:32.450853   10.10.80.10    10.55.10.1  MA_HIGH
6 2021-02-10 07:52:34.264042   10.10.80.10    10.55.10.1  PL_DOWN

Во-первых, я хочу получить подсчет каждого значения в столбце type за минуту (в значениях столбца type для подсчета следует учитывать только первую часть разбиения _. это будет выглядеть примерно так

          date     LT PL  MA
0 2021-02-10 07:49 3  0   0
1 2021-02-10 07:50 0  2   0
2 2021-02-10 07:51 0  0   1
3 2021-02-10 07:52 0  1   0

Но приведенные выше данные не говорят для каждой уникальной пары значений столбца start и end, каков счет для LT, PL, MA ( после разделения на _).

Благодаря @Sayandip Dutta он предоставил решение ниже (https://stackoverflow.com/a/66136108 / 5550284)

pd.crosstab(
       index=df['date'].dt.floor('1min'), 
       columns=[
           df['start'].add('-').add(df['end']).rename('star-end'), 
           df['type'].str.extract(r'(\w+)_', expand=False)
       ], 
       dropna=False
)

Вот как выглядит фреймворк

start-end           10.10.80.10-10.55.10.1       10.100.80.10-10.55.10.1       12.100.90.10-100.100.12.1      
type                                    LT MA PL                      LT MA PL                        LT MA PL
date                                                                                                          
2021-02-10 07:49:00                      0  0  0                       0  0  0                         3  0  0
2021-02-10 07:50:00                      0  0  0                       0  0  1                         0  0  1
2021-02-10 07:51:00                      0  1  0                       0  0  0                         0  0  0
2021-02-10 07:52:00                      0  0  1                       0  0  0                         0  0  0

Итак, преобразовав приведенное выше в логическое значение, это выглядит так, как показано ниже

start-end           10.10.80.10-10.55.10.1       10.100.80.10-10.55.10.1       12.100.90.10-100.100.12.1      
type                                     LT     MA     PL                      LT     MA     PL                            LT     MA     PL
date                                                                                                          
2021-02-10 07:49:00                      False  False  False                   False  False  False                         True   False  False
2021-02-10 07:50:00                      False  False  False                   False  False  True                          False  False  True
2021-02-10 07:51:00                      False  True  False                    False  False  False                         False  False  False
2021-02-10 07:52:00                      False  False  True                    False  False  False                         False  False  False

Теперь я хочу знать для каждой уникальной пары start и end, каково общее количество True для LT, MA и {{X5} }. Итак, мой последний Dataframe должен выглядеть так

start         end           LT  MA  PL
10.10.80.10   10.55.10.1    0   1   1
10.100.80.10  10.55.10.1    0   0   1
12.100.90.10  100.100.12.1  1   0   1

Я просто не могу понять, как мне извлечь необходимую информацию из кросс-таблицы.

1
Souvik Ray 10 Фев 2021 в 20:15

1 ответ

Лучший ответ

Вы можете использовать то же решение, о котором говорите, и суммировать, и разложить по последней оси:

pd.crosstab(
       index=df['date'].dt.floor('1min'), 
       columns=[
           df['start'], 
           df['end'], 
           df['type'].str.extract(r'(\w+)_', expand=False)
      ], 
    ).astype(bool).sum().unstack(-1, fill_value=0)

type                       LT  MA  PL
start        end                     
10.10.80.10  10.55.10.1     0   1   1
10.100.80.10 10.55.10.1     0   0   1
12.100.90.10 100.100.12.1   1   0   1
3
Sayandip Dutta 11 Фев 2021 в 10:07