You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:查找DataFrame中非零数值簇的频率及簇首元素位置

解决非零数值簇的频率与首元素位置问题

没问题,我来帮你搞定这个需求!咱们一步步来,先把你给的原始数据转换成pandas DataFrame,再识别出连续的非零数值簇,最后就能得到簇的数量(也就是你说的频率)和每个簇第一个非零元素的位置了。

步骤1:构造初始DataFrame

首先把你提供的时间和数值整理成结构化数据,转换成pandas DataFrame,同时把时间字符串转成datetime类型方便后续处理:

import pandas as pd

# 整理你给出的原始数据
raw_data = [
    ("1/2/2010 5:00", 0),
    ("1/2/2010 6:00", 0),
    ("1/2/2010 7:00", 0),
    ("1/2/2010 8:00", 0),
    ("1/2/2010 9:00", 5),
    ("1/2/2010 10:00", 0),
    ("1/2/2010 11:00", 2),
    ("1/2/2010 12:00", 51),
    ("1/2/2010 13:00", 68),
    ("1/2/2010 14:00", 58),
    ("1/2/2010 15:00", 0),
    ("1/2/2010 16:00", 0),
    ("1/2/2010 17:00", 0),
    ("1/2/2010 18:00", 60),
    ("1/2/2010 19:00", 24),
    ("1/2/2010 20:00", 24),
    ("1/2/2010 21:00", 0),
    ("1/2/2010 22:00", 0)
]

# 创建DataFrame并转换时间格式
df = pd.DataFrame(raw_data, columns=["timestamp", "value"])
df["timestamp"] = pd.to_datetime(df["timestamp"], format="%m/%d/%Y %H:%M")

步骤2:识别连续的非零数值簇

核心思路是先标记所有非零值,然后通过判断“从0切换到非零”的节点来生成唯一的簇ID,这样就能把连续的非零值归为同一个簇:

# 标记每行是否为非零值
df["is_non_zero"] = df["value"] != 0

# 生成簇ID:只有当当前行是非零且上一行是零时,簇ID才递增
df["cluster_id"] = (df["is_non_zero"] & ~df["is_non_zero"].shift(1, fill_value=False)).cumsum()

# 筛选出所有非零簇的数据,方便后续分析
non_zero_clusters = df[df["is_non_zero"]].copy()

步骤3:获取簇的频率与首元素位置

现在我们可以对簇ID分组,提取每个簇的第一个非零元素的时间戳,同时统计簇的总数量(也就是你要的频率):

# 获取每个簇的第一个非零元素的位置(时间戳)
cluster_first_pos = non_zero_clusters.groupby("cluster_id")["timestamp"].first().reset_index()
cluster_first_pos.columns = ["簇ID", "第一个非零元素时间"]

# 计算非零簇的总数量(频率)
cluster_frequency = len(cluster_first_pos)

# 打印结果
print(f"非零数值簇的频率(总数量):{cluster_frequency}")
print("\n每个簇的第一个非零元素位置:")
print(cluster_first_pos)

运行结果

执行上述代码后,你会得到如下输出:

非零数值簇的频率(总数量):3

每个簇的第一个非零元素位置:
   簇ID 第一个非零元素时间
0    1 2010-01-02 09:00:00
1    2 2010-01-02 11:00:00
2    3 2010-01-02 18:00:00

结果解释

  • 总共有3个独立的非零数值簇:
    1. 第一个簇仅包含9:00的数值5(因为下一行10:00是0,单独成簇)
    2. 第二个簇是11:00到14:00的连续非零值(2、51、68、58)
    3. 第三个簇是18:00到20:00的连续非零值(60、24、24)

额外需求:如果需要每个簇的元素数量

如果你说的“频率”指的是每个簇内的元素个数(簇的长度),可以加上这段代码:

# 计算每个簇的元素数量
cluster_lengths = non_zero_clusters.groupby("cluster_id").size().reset_index(name="簇内元素数量")
print("\n每个簇的元素数量:")
print(cluster_lengths)

运行结果:

每个簇的元素数量:
   簇ID  簇内元素数量
0    1        1
1    2        4
2    3        3

内容的提问来源于stack exchange,提问作者Zanam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:03:41