import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(30,3))
df.head()
给出:
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
假设我想添加另一列将构建第2列中的平均值:在index(0,1)(1,2)...(28,29)之间。
我认为这是一项常见的任务,因为第2列是x轴位置,我希望绘图上的分类标签出现在x轴上2点之间的中间。
所以我想知道是否有一个熊猫的方式:
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()
给出:
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
如你所见,0.31的平均值为0.21和0.42。
谢谢!
答案 0 :(得分:4)
我认为您可以使用pandas.DataFrame.rolling
执行此操作。以数据框头为例:
df['averages'] = df[2].rolling(2).mean().shift(-1)
返回:
>>> 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
最后的NaN
是因为没有索引4的行;但是在你的完整数据框中,它会持续到第二行到最后一行(索引28和29的值的平均值,即你的第29和第30个值)。我只是想表明它给出了与你想要的输出相同的值,所以我使用了你提供的确切数据。 (为了将来参考,如果你想从随机数为我们提供可重现的数据帧,在创建df之前使用并向我们展示一个随机种子,例如np.random.seed(42)
,那样,我们都将拥有相同的种子。 )
将其分解:
df[2]
因为你对第2栏感兴趣; .rolling(2)
是因为你想获得2个值的平均值(如果你想要3个值的平均值,使用.rolling(3)
等等),.mean()
是你想要的任何函数(在你的情况下,意思是);最后.shift(-1)
确保新列位于正确的位置(即,确保显示第2列中每个值的平均值和下面的值,因为默认值为值高于)
答案 1 :(得分:1)
这是一种方式,虽然有点循环。但@sacul's solution更好。我把它留在这里仅供参考。
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