Python 如何将熊猫中不同间隔的一列与另一列进行分组?
我有以下pd.DataFrame: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]]).
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如下所示:
任何帮助都将不胜感激。您可以使用我对其进行了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实例。