代码之家  ›  专栏  ›  技术社区  ›  viraptor

将时间序列转换为热图

  •  1
  • viraptor  · 技术社区  · 6 年前

    我正在寻找一个大熊猫的好的转变,这将允许我从一个时间序列的测量到一个计数每箱每箱每箱的时间清单。

    假设我有我的:

    x = list(range(count))
    y = [random.gauss(1, 0.1) for _ in range(count)]
    

    我可以将其转换为两侧的组合间隔:

    df = pandas.DataFrame.from_dict({'x': x, 'y': y})
    df['x'].update(pandas.cut(df['x'], 20))
    df['y'].update(pandas.cut(df['y'], 20))
    

    我知道我可以得到 y 用途:

    df['y'].value_counts()
    

    但我很难把“运行价值”放在 按唯一性分组 x 值,然后展开并将其返回到有效操作中。


    例子:

    y = [1, 1, 2, 3, 4, 4]
    x = [0, 1, 2, 3, 4, 5]
    bin_count = 2
    

    预期:

    df: x    y  count
        0-2  1  2
        0-2  2  1
        3-5  3  1
        3-5  4  2
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   jezrael    6 年前

    我相信你需要 SeriesGroupBy.value_counts 具有 reset_index 以下内容:

    y = [1, 1, 2, 3, 4, 4]
    x = [0, 1, 2, 3, 4, 5]
    bin_count = 2
    df = pd.DataFrame.from_dict({'x': x, 'y': y})
    df['x'].update(pd.cut(df['x'], bin_count))
    
    df1 = df.groupby('x')['y'].value_counts().reset_index(name='count')
    print (df1)
                   x  y  count
    0  (-0.005, 2.5]  1      2
    1  (-0.005, 2.5]  2      1
    2     (2.5, 5.0]  4      2
    3     (2.5, 5.0]  3      1
    

    对于来自的列 y 使用 unstack :

    df1 = df.groupby('x')['y'].value_counts().unstack(fill_value=0)
    print (df1)
    y              1  2  3  4
    x                        
    (-0.005, 2.5]  2  1  0  0
    (2.5, 5.0]     0  0  1  2
    

    编辑:

    如果需要容器的唯一值,请添加参数 labels=False cut :

    df['x'].update(pd.cut(df['x'], bin_count, labels=False))
    
    df1 = df.groupby('x')['y'].value_counts().unstack(fill_value=0)
    print (df1)
    y  1  2  3  4
    x            
    0  2  1  0  0
    1  0  0  1  2