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个独立的非零数值簇:
- 第一个簇仅包含
9:00的数值5(因为下一行10:00是0,单独成簇) - 第二个簇是
11:00到14:00的连续非零值(2、51、68、58) - 第三个簇是
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
相关产品推荐
相关产品推荐

