假设我有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