【问题标题】:How to get frequency count of column values for each unique pair of columns in pandas?如何获取熊猫中每对唯一列的列值的频率计数?
【发布时间】:2021-02-11 18:07:05
【问题描述】:

我有一个如下所示的数据框

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 列中每个值的计数(在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

但上述数据并不能说明每对独特的 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
)

这是数据框的样子

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

现在我想知道,对于每一对独特的 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

我似乎不知道如何从交叉表中提取所需的信息。

【问题讨论】:

  • 为什么LT1 对应于行12.100.90.10 100.100.12.1 ?我想应该是3
  • @ShubhamSharma 我正在计算每种情况下True 的总出现次数。如果您参考之前的 Dataframe(就在它的正上方),LT12.100.90.10 100.100.12.1 包含一个 True。因此True 的总数为 1。
  • 我真的不确定你是如何在数据框中得到布尔值的。也许你可以试试下面@anky 的答案。

标签: python pandas


【解决方案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

【讨论】:

  • 嗨!感谢您回到我的问题。我尝试了您的解决方案,但如果我更改预期为 LT12.100.90.10 100.100.12.1 的计数为 2 的数据,您的结果似乎是错误的。这是codeshare.io/24Z7JK 的详细解释,我认为您错过了您在之前的交叉表中所做的.dt.floor('1min'),它给出了正确的计数。
  • @SouvikRay 我明白了,我想我现在明白了。检查编辑,如果它有效。
  • 谢谢老兄!这终于是我想要的了。再次感谢您抽出时间来帮助我。我真的很感激!
猜你喜欢
  • 1970-01-01
  • 2019-05-26
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 2017-05-30
相关资源
最近更新 更多