Pandas只在整个Dataframe的子集上运行函数



假设我有Dataframe,它有200个值,即产品价格。我想在这个数据帧上运行一些操作,比如计算最后10个价格的平均价格。按照我的理解,熊猫现在会遍历每一行,并计算每一行的平均值。即前9行将是Nan,然后从10-200开始,它将计算每行的平均值。

我的问题是,我需要做很多这样的计算,性能是个问题。出于这个原因,我只想对所有值中的最后10个值(不需要更多)运行平均值,而我想将这些值保留在数据帧中。我不想去掉这些值或创建新的数据帧。我基本上只是想在更少的数据上进行计算,所以速度更快。

这样的事情可能发生吗?希望问题是清楚的。

在Chicodelarose的答案的基础上,您可以在一个更"类似CCD_ 1的";语法。

如下定义您的df,我们可以在[0, 1000)内获得200个价格。

df = pd.DataFrame((np.random.rand(200) * 1000.).round(decimals=2), columns=["price"])

不过,你正在寻找的是以下内容:

def add10(n: float) -> float:
"""An exceptionally simple function to demonstrate you can set 
values, too.
"""
return n + 10
df["price"].iloc[-12:] = df["price"].iloc[-12:].apply(add10)

当然,您也可以使用这些选择来返回其他内容,而无需设置值。

>>> df["price"].iloc[-12:].mean().round(decimals=2)
309.63  # this will, of course, be different as we're using random numbers

这种方法的主要理由在于使用pandas工具。假设您想对具有多列的数据子集进行操作,只需调整.apply(...)以包含axis参数,如下所示:.apply(fn, axis=1)

pandas中花费的时间越长,它的可读性就越强。

给定如下数据帧:

Price
0    197.45
1     59.30
2    131.63
3    127.22
4     35.22
..      ...
195   73.05
196   47.73
197  107.58
198  162.31
199  195.02
[200 rows x 1 columns]

调用以下命令以获得数据帧最后n行的平均值:

def mean_over_n_last_rows(df, n, colname):
return df.iloc[-n:][colname].mean().round(decimals=2)
print(mean_over_n_last_rows(df, 2, "Price"))

输出:

178.67

最新更新