如何提高这个pandas数据转换的效率?

48 浏览
0 Comments

如何提高这个pandas数据转换的效率?

有没有一种pandas内置的方法可以对同一列df["returns"]应用两个不同的聚合函数f1和f2,而不需要多次调用agg()函数?

示例数据框:

import pandas as pd
import datetime as dt
import numpy as np
pd.np.random.seed(0)
df = pd.DataFrame({
         "date"    :  [dt.date(2012, x, 1) for x in range(1, 11)], 
         "returns" :  0.05 * np.random.randn(10), 
         "dummy"   :  np.repeat(1, 10)
}) 

虽然语法上是错误的,但直觉上是正确的方式是:

# 假设f1和f2是用于聚合的函数。
df.groupby("dummy").agg({"returns": f1, "returns": f2})

显然,Python不允许重复的键。有没有其他的方式来表达agg()的输入呢?也许使用一个元组列表[(column, function)]会更好,以允许对同一列应用多个函数?但是agg()似乎只接受一个字典。

除了定义一个仅仅在其中应用这两个函数的辅助函数之外,还有没有其他的解决方法?(在聚合中如何工作?)

0
0 Comments

问题的原因:这个问题出现的原因是因为作者对于如何提高pandas数据转换的效率有疑问。作者已经使用了groupby函数来对数据进行处理,但是想知道是否有更有效的方法来完成这个任务。

解决方法:可以使用transform函数来代替agg函数,这样就可以更有效地进行数据转换。下面是修改后的代码:

df['func1'] = df.groupby('dummy')['returns'].transform('sum')
df['func2'] = df.groupby('dummy')['returns'].transform('prod')

这样,我们就可以直接在原始数据框中添加新的列'func1'和'func2',而不需要创建一个新的数据框。这种方法比之前的方法更有效,因为它只需要进行一次groupby操作,并且只需要遍历数据一次。

另外,我们还可以使用apply函数来完成相同的任务,但是transform函数通常比apply函数更有效。这是因为transform函数可以利用pandas的内置优化,而apply函数需要将每个组的数据作为参数传递给自定义函数,这会导致额外的开销。

通过使用transform函数来替代agg函数,我们可以更有效地进行pandas数据转换。这种方法只需要进行一次groupby操作,并且只需要遍历数据一次,因此可以提高代码的效率。

0
0 Comments

如何改进这个pandas数据转换以提高效率?

问题的原因:从2022-06-20开始,对于聚合操作,推荐使用df.groupby().agg()的方法,其中函数作为参数传递。然而,在历史版本的pandas中,可以将函数作为列表或字典传递。

解决方法:按照新的推荐方法进行修改,使用df.groupby().agg()函数,并将函数作为参数传递。具体操作如下:

df.groupby('dummy').agg(
    Mean=('returns', np.mean),
    Sum=('returns', np.sum))

如果使用历史版本的pandas,可以将函数作为列表或字典传递。具体操作如下:

列表传递:

df.groupby("dummy").agg({"returns": [np.mean, np.sum]})

字典传递:

df.groupby('dummy').agg({'returns':
                                  {'Mean': np.mean, 'Sum': np.sum}})

以上是如何改进这个pandas数据转换以提高效率的方法。更多信息可以参考这个回答

0
0 Comments

如何才能将这个pandas数据转换变得更高效?

问题的原因:在较新的pandas版本(大于等于0.25)中,GroupBy.agg方法的行为发生了改变,以支持更直观的语法来指定命名聚合。这导致一些旧的用法产生了问题。

解决方法:根据pandas的官方文档,可以使用Named Aggregation来解决这个问题。在新的语法中,可以通过关键字参数传递一个元组来指定聚合的列和聚合函数。具体的方法如下:

df.groupby('kind').agg(max_height=('height', 'max'), min_weight=('weight', 'min'))

或者使用pd.NamedAgg来更明确地指定列和聚合函数:

df.groupby('kind').agg(max_height=pd.NamedAgg(column='height', aggfunc='max'), min_weight=pd.NamedAgg(column='weight', aggfunc='min'))

对于Series对象,可以直接将聚合函数传递给关键字参数:

df.groupby('kind')['height'].agg(max_height='max', min_height='min')

如果列名不是有效的Python标识符,可以使用字典和解包的方式来指定列名:

df.groupby('kind')['height'].agg(**{'max height': 'max', ...})

对于旧版本的pandas(小于0.25),可以使用字典来指定列名和聚合函数。但是在更新的版本中,使用字典来重命名列被弃用了,而是使用了更简单的方式,即传递一个元组的列表来指定聚合函数。如下所示:

df.groupby("dummy").agg({'returns': [('op1', 'sum'), ('op2', 'mean')]})

或者使用更简洁的方式:

df.groupby("dummy")['returns'].agg([('op1', 'sum'), ('op2', 'mean')])

通过使用Named Aggregation的新语法,可以更简洁、更直观地指定列和聚合函数,从而提高pandas数据转换的效率。

0