【发布时间】: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
但上述数据并不能说明每对独特的 start 和 end 列值,LT、PL、MA 的计数是多少(在 _ 上拆分后) .
感谢 @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
现在我想知道,对于每一对独特的 start 和 end,LT、MA 和 PL 的 True 总数是多少。所以我最终的 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
我似乎不知道如何从交叉表中提取所需的信息。
【问题讨论】:
-
为什么
LT值1对应于行12.100.90.10 100.100.12.1?我想应该是3。 -
@ShubhamSharma 我正在计算每种情况下
True的总出现次数。如果您参考之前的 Dataframe(就在它的正上方),LT对12.100.90.10 100.100.12.1包含一个True。因此True的总数为 1。 -
我真的不确定你是如何在数据框中得到布尔值的。也许你可以试试下面@anky 的答案。