Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将熊猫中不同间隔的一列与另一列进行分组?_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何将熊猫中不同间隔的一列与另一列进行分组?

Python 如何将熊猫中不同间隔的一列与另一列进行分组?,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下pd.DataFrame: source = pd.DataFrame([[0.99, 0.98, 0.93, 0.81, 0.85, 0.71, 0.7, 0.69, 0.68, 0.66], [100, 12, 312, 23, 2, 12, 32, 21, 21, 21]]).T 我希望尽快将其转换为: desired_result = pd.DataFrame([[0.9, 0.8, 0.7, 0.6], [424, 25, 44, 63]]).

我有以下pd.DataFrame:

source = pd.DataFrame([[0.99, 0.98, 0.93, 0.81, 0.85, 0.71, 0.7, 0.69, 0.68, 0.66], 
              [100, 12, 312, 23, 2, 12, 32, 21, 21, 21]]).T

我希望尽快将其转换为:

desired_result = pd.DataFrame([[0.9, 0.8, 0.7, 0.6], [424, 25, 44, 63]]).T
其中,我定义了
0.1
的间隔,我将该间隔应用于
0
列和
数据帧,并对同一数据帧的
1
列求和。这个想法是,这应该以不同的间隔工作

我尝试的是:

  • 我曾考虑过使用
    pd.cut
    ,但这似乎不是我想要的

  • 我知道如果我在
    source
    中添加一个新列,该列对应的行上有0.9、0.8、0.7和0.6的重复值,那么我可以在这个新列上使用
    groupby
    ,然后使用
    sum
    ,但我想知道是否有更干净、更快捷的方法?e、 g.smth如下所示:

  • 但是,如果我将时间间隔从0.1更改为0.05,上述方法将不起作用


    任何帮助都将不胜感激。

    您可以使用我对其进行了3次修改的
    自定义功能:

  • 我用了
    np.floor
    而不是
    round
    ,因为你想下去
  • 这会弄乱箱子“边界”上的值,因此我添加
    +base/100
    (因此
    0.9
    将是
    0.9+.009=0.909
    ,并向下舍入到.9,而不是不正确地舍入到0.8),以便它刚好位于边界上方,并正确地向下舍入。我想这会涵盖你的。为了安全起见,您可以执行
    1/1000
  • 我分享的答案是寻找
    int
    ,因此删除了
    int
    ,因为我们正在寻找舍入浮动

  • 在我的计算机上,接受的答案较慢:

    102 ms ± 1.86 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    

    您可以使用一个
    custom\u round
    函数,我对该函数进行了3次修改:

  • 我用了
    np.floor
    而不是
    round
    ,因为你想下去
  • 这会弄乱箱子“边界”上的值,因此我添加
    +base/100
    (因此
    0.9
    将是
    0.9+.009=0.909
    ,并向下舍入到.9,而不是不正确地舍入到0.8),以便它刚好位于边界上方,并正确地向下舍入。我想这会涵盖你的。为了安全起见,您可以执行
    1/1000
  • 我分享的答案是寻找
    int
    ,因此删除了
    int
    ,因为我们正在寻找舍入浮动

  • 在我的计算机上,接受的答案较慢:

    102 ms ± 1.86 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
    

    对于速度:始终尝试尽可能地矢量化,并尽可能避免应用
    apply

    这里有一个更快的方法(归功于@DavidErickson的
    sort=False
    ):

    对于较大的
    df
    ,速度差异可能非常显著

    尝试使用100万行,分组在10K存储箱中:

    source = pd.DataFrame(np.random.normal(scale=1000, size=(int(1e6), 2)))
    
    %%timeit
    # ... (as above)
    26.7 ms ± 292 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    使用
    应用

    1.51 s ± 11 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    

    (速度慢50倍)。

    关于速度:始终尽可能尝试矢量化,并尽可能避免应用

    这里有一个更快的方法(归功于@DavidErickson的
    sort=False
    ):

    对于较大的
    df
    ,速度差异可能非常显著

    尝试使用100万行,分组在10K存储箱中:

    source = pd.DataFrame(np.random.normal(scale=1000, size=(int(1e6), 2)))
    
    %%timeit
    # ... (as above)
    26.7 ms ± 292 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
    
    使用
    应用

    1.51 s ± 11 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
    

    (慢50倍)。

    谢谢。但是如果我定义了不同的时间间隔,它对每个时间间隔都不起作用,对吗?是的,这只对0.1的时间间隔起作用。我可能把我的问题说错了(这是我的错)。为了清晰起见,我现在编辑了一点。@Newskooler我使它更具活力他的作品。申请是一个确定的方法。谢谢,谢谢。但是如果我定义了不同的时间间隔,它对每个时间间隔都不起作用,对吗?是的,这只对0.1的时间间隔起作用。我可能把我的问题说错了(这是我的错)。为了清晰起见,我现在编辑了一点。@Newskooler我使它更具活力他的作品。申请是一个确定的方法。谢谢。看起来你的电脑很快(我的电脑比你的慢3倍)。无论如何,在我的电脑上,我的解决方案大约快10%。另外,将
    sort=False
    传递给groupby会使你的代码速度提高5%左右。@DavidErickson:使用
    sort=False
    是个好主意。这不是我的电脑,我只是租了它。。。一个普通的
    r5d.2xlarge
    AWS实例。看起来你的电脑速度很快(我的电脑比你的慢3倍)。无论如何,在我的电脑上,我的解决方案大约快10%。另外,将
    sort=False
    传递给groupby会使你的代码速度提高5%左右。@DavidErickson:使用
    sort=False
    是个好主意。这不是我的电脑,我只是租了它。。。普通的
    r5d.2xlarge
    AWS实例。