numpy Pandas秩函数的自定义方法或均值计算中小数位数的限制

jckbn6z7  于 2023-04-30  发布在  其他
关注(0)|答案(2)|浏览(128)

编辑:我的问题问得不好,也不够详细。我正在重新做得更好,请给我时间做
编辑2:我的问题不够清楚,也不适应我的问题,我用不同的方式解决了我的问题。我不能删除问题,但请不要回答,我搞砸了问题。
我的目标是用average方法在pandas Dataframe 上执行排名计算,但是平均计算应该四舍五入到3位小数。
原因:我正在将一个脚本从另一种语言翻译成Python,在这种语言中,mean函数会自动将结果舍入为小数点后的3位。Pandas不会。因此,为了在Python中获得完全相同的结果(我必须),我需要:

  • 将自定义method参数传递给rank函数,此自定义方法为舍入平均值
  • 强制Python在计算平均值时只取3位小数(这对我的脚本来说很好)。

这些想法有可能吗?
第一语言:

mean(mydata['mycolumn']) = 1360.045

在Python中:

mydata.mycolumn.mean() = 1360.0448559218441

因此,当计算mycolumn的排名(如果重要的话,则由另一列分组,idk)时,排名是不一样的,最终结果在两种语言之间是不同的。

esbemjvw

esbemjvw1#

您可以为DataFrames创建自定义方法:

from pandas.core.base import PandasObject

def round3mean(self, *args, **kwargs):
    return self.round(3).mean(*args, **kwargs)
    # or, depending on the order of computation in your other langage
    # self.mean(*args, **kwargs).round(3)

PandasObject.round3mean = round3mean

示例:

df = pd.DataFrame({'col1': [1.1234567, 1.1234567, 1.1234567]})

df.mean()

col1    1.123457
dtype: float64

df.round3mean()

col1    1.123
dtype: float64

rank组合:

np.random.seed(0)

df = pd.DataFrame(np.random.random(size=(4, 3)), columns=['col1', 'col2', 'col3'])

out = df.round3mean().rank()
  • 注:如果需要,您也可以创建一个round3rank方法来直接执行此操作。*
from pandas.core.base import PandasObject

def round3rank(self, *args, **kwargs):
    return self.mean(*args, **kwargs).round(3).rank()

PandasObject.round3rank = round3rank

df.round3rank()

输出:

col1    1.0
col2    3.0
col3    2.0
dtype: float64
gk7wooem

gk7wooem2#

您可以创建自定义函数:

custom_func = lambda x: round(x.mean(), 3)

out = mydata.groupby('col')['mycolumn'].agg(custom_func)

相关问题