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

Python DataFrame-以创造性的方式在值列表之间滚动计数/计数

  •  -1
  • jasonmclose  · 技术社区  · 3 月前

    我正在做一个项目,并选择尝试学习一些DataFrame,因为我是新手。

    我有一个有趣的问题,你们可能会帮助我解决,因为DataFrame看起来相当强大,而且有一些巧妙的功能。

    我有2个数据帧。第一个是有一个值的字典列表。第二个没有数据,但有一个整数列列表。

    data1 = [{'Start': 51, 'End': 55},{'Start':24, 'End':37},{'Start':89,'End':122},{'Start':44, 'End':31}, {'Start':77, 'End':50}, {'Start':10, 'End':9}]
    dfm1 = pd.DataFrame.from_dict(data1)
    
    data2 = [-40, -30, -20, -10, 0, 10, 20, 30, 40]
    dfm2 = pd.DataFrame([], columns=data2)
    

    假设data1有500个数据点。你明白了。。。

    我的目标是,我想要一个差异范围的统计 dfm1 基于可变滑动窗口大小,我希望该计数存在于dfm2中。

    所以我想做的有趣的事情是巧妙地创建一个计算之间差异的滑动窗口 data1[index + window] - data1[index] 然后,基于2个索引处的值之间的差,如果dfm2小于或等于 dfm1 列值,但不小于第1列的值。所以,我们假设,在我的例子中 -40 永远不会有大于0的计数。

    我想要的日期输出,比如说我提供的dfm1值,我们正在计算开始值,大小为2的窗口将是(对于dfm2):

    [0, 1, 1, 0, 0, 0, 1, 0, 1]
    

    对于2的窗口大小,这将执行51-89=-38,24-44=-20,89-77=12,44-10=34。3的窗口大小为51-44、24-77和89-10。。。

    对我来说,这种既便宜又简单的方法显然是迭代和创建计数。但我知道 DataFrame 有一些 酷和性感 函数如 rolling 这可能真的很有效。

    作为老板模式的最后一个问题,如果我想做同样的滚动计数,但不是减法,该怎么办 Start 从…起 开始 ,如果我想减去一个指数 开始 来自同一个 End ,然后根据与 window_size 离开

    复活节彩蛋老板模式的一个问题是:如果我没有在dfm2中预设列名,而是让它们在发现新的计数时自动添加,会怎么样?在10的范围内说?

    1 回复  |  直到 3 月前
        1
  •  1
  •   meshkati    3 月前

    具有 rolling 以及问题的第一部分:

    def tally_differences(dfm1, dfm2, window_size):
        diff_df = dfm1['Start'].diff(window_size)
    
        bins = dfm2.columns.tolist() + [float('inf')]
        labels = dfm2.columns.tolist()
        tallies = pd.cut(diff_df, bins=bins, labels=labels, right=False).value_counts()
    
        dfm2_updated = dfm2.copy()
        dfm2_updated.loc[0] = tallies
    
        return dfm2_updated
    
    
    window_size = 2
    dfm2_updated = tally_differences(dfm1, dfm2, window_size)
    print(dfm2_updated)
    

    输出

       -40  -30  -20  -10   0    10   20   30   40
    0    1    0    1    0    0    0    1    1    0
    

    对于你的超级老板模式,我不知道我是否理解得很好(我希望有人以正确的方式编辑你的问题文本),但是:

    def tally_differences_easter_egg(dfm1, window_size):
        diff_df = dfm1['End'] - dfm1['Start']
    
        bins = pd.interval_range(start=diff_df.min()//10*10, end=diff_df.max()//10*10+10, freq=10, closed='left')
        tallies = pd.cut(diff_df.rolling(window_size).sum(), bins=bins).dropna().astype(str).value_counts()
    
        dfm2 = pd.DataFrame(columns=tallies.index)
        dfm2.loc[0] = tallies
    
        return dfm2
    
    window_size = 2
    dfm2_easter_egg = tally_differences_easter_egg(dfm1, window_size)
    print(dfm2_easter_egg)
    

    这将给我们:

       [10, 20)  [20, 30)  [-30, -20)
    0         1         1           1