Python 有没有办法得到连续行之间的平均值?
其中:Python 有没有办法得到连续行之间的平均值?,python,pandas,Python,Pandas,其中: import pandas as pd import numpy as np df = pd.DataFrame(np.random.rand(30,3)) df.head() averages = [] for index, item in enumerate(df[2]): if index < df[2].shape[0] -1: averages.append((item + df[2].iloc[index + 1]) / 2) df["aver
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(30,3))
df.head()
averages = []
for index, item in enumerate(df[2]):
if index < df[2].shape[0] -1:
averages.append((item + df[2].iloc[index + 1]) / 2)
df["averages"] = pd.Series(averages)
df.head()
假设我想添加另一列来构建第2列中的平均值:在索引(0,1)(1,2)之间。。。(28,29)
我认为这是一项常见的任务,因为第2列是x轴位置,我希望绘图上的分类标签显示在x轴上两个点之间的中间
所以我想知道是否有一种方法:
0 1 2
0 0.741955 0.913681 0.110109
1 0.079039 0.662438 0.510414
2 0.469055 0.201658 0.259958
3 0.371357 0.018394 0.485339
4 0.850254 0.808264 0.469885
如你所见,0.31是0.21和0.42的平均值
谢谢 我认为您可以使用
pandas.DataFrame.rolling
实现这一点。以您的数据帧头为例:
0 1 2 averages
0 0.997044 0.965708 0.211980 0.318781
1 0.716349 0.724811 0.425583 0.378653
2 0.729991 0.985072 0.331723 0.333138
3 0.996487 0.272300 0.334554 0.586686
返回:
df['averages'] = df[2].rolling(2).mean().shift(-1)
末尾的NaN
存在,因为没有行索引4;但在完整的数据帧中,它将一直持续到倒数第二行(索引28和29的平均值,即第29和第30个值)。我只是想说明这与您期望的输出值相同,所以我使用了您提供的确切数据。(为了将来的参考,如果您想从随机数中为我们提供一个可复制的数据帧,请在创建df之前使用并向我们显示一个随机种子,例如np.random.seed(42)
,这样,我们都将拥有相同的种子。)
分解它:
df[2]
是因为您对第2列感兴趣.rolling(2)
之所以存在,是因为您想要得到2个值的平均值(如果您想要3个值的平均值,请使用.rolling(3)
等…),.mean()
是您想要的任何函数(在您的情况下,是平均值);最后,.shift(-1)
确保新列位于正确的位置(即,确保在第2列中显示每个值的平均值和下面的值,因为默认值是上面的值)这是一种方法,尽管有点循环。但这更好。我把这个留在这里仅供参考
>>> df
0 1 2 averages
0 0.997044 0.965708 0.211980 0.318781
1 0.716349 0.724811 0.425583 0.378653
2 0.729991 0.985072 0.331723 0.333139
3 0.996487 0.272300 0.334554 NaN
import pandas as pd
import numpy as np
from itertools import zip_longest
df = pd.DataFrame(np.random.rand(30, 3))
v = df.values[:, -1]
df = df.join(pd.DataFrame(np.array([np.mean([i, j], axis=0) for i, j in \
zip_longest(v, v[1:], fillvalue=v[-1])]), columns=['2_pair_avg']))
# 0 1 2 2_pair_avg
# 0 0.382656 0.228837 0.053199 0.373678
# 1 0.812690 0.255277 0.694156 0.697738
# 2 0.040521 0.211511 0.701320 0.491044
# 3 0.558739 0.697916 0.280768 0.615398
# 4 0.262771 0.912669 0.950029 0.489550
# 5 0.217489 0.405125 0.029071 0.101794
# 6 0.577929 0.933565 0.174517 0.214530
# 7 0.067030 0.452027 0.254544 0.613225
# 8 0.580869 0.556112 0.971907 0.582547
# 9 0.483528 0.951537 0.193188 0.175215
# 10 0.481141 0.589833 0.157242 0.159363
# 11 0.087057 0.823691 0.161485 0.108634
# 12 0.319516 0.161386 0.055784 0.285276
# 13 0.901529 0.365992 0.514768 0.386599
# 14 0.270118 0.454583 0.258430 0.245463
# 15 0.379739 0.299569 0.232497 0.214943
# 16 0.017621 0.182647 0.197389 0.538386
# 17 0.720688 0.147093 0.879383 0.732239
# 18 0.859594 0.538390 0.585096 0.503846
# 19 0.360718 0.571567 0.422596 0.287384
# 20 0.874800 0.391535 0.152171 0.239078
# 21 0.935150 0.379871 0.325984 0.294485
# 22 0.269607 0.891331 0.262986 0.212050
# 23 0.140976 0.414547 0.161115 0.542682
# 24 0.851434 0.059209 0.924250 0.801210
# 25 0.389025 0.774885 0.678170 0.388856
# 26 0.679247 0.982517 0.099542 0.372649
# 27 0.670354 0.279138 0.645756 0.336031
# 28 0.393414 0.970737 0.026307 0.343947
# 29 0.479611 0.349401 0.661587 0.661587