簡體   English   中英

如何獲取 pandas 中每對唯一列的列值的頻率計數?

[英]How to get frequency count of column values for each unique pair of columns in pandas?

我有一個如下所示的 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')]

如您所見,每分鍾記錄一次數據。 我剛剛在這里展示了完整數據的一部分。

這是在 pandas 中加載它時的樣子

                        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列中每個值的計數(在 column type的值中,只應考慮_ split 的第一部分進行計數。所以它看起來像

          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

但上述數據並不能說明每一對唯一的startend列值, LTPLMA的計數是多少(在_上拆分后)。

感謝@Sayanip 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
)

這是 dataframe 的樣子

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

因此,將上述轉換為 boolean,如下所示

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

現在我想知道,對於每一對獨特的startendLTMAPLTrue總數是多少。 所以我最終的 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

我似乎無法弄清楚如何從交叉表中提取所需的信息。

您可以使用您所指的相同解決方案並求和,然后沿最后一個軸取消堆疊:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM