我有像这样的pandas DataFrame
100 200 300
283.1 0.01 0.02 0.40
284.1 0.02 0.03 0.42
285.1 0.05 0.01 0.8
286.1 0.06 0.02 0.9
我需要组合一定数量的连续行并计算每列的平均值和新索引作为我使用的索引的平均值,以获得如下所示:< / p>
100 200 300
283.6 0.015 0.025 0.41
285.6 0.055 0.015 0.85
pandas有没有办法解决这个问题?
答案 0 :(得分:2)
是的 - 你可以在熊猫中做到这一点。这是一种方法。
让我们说出来,我们的初始数据框df
就像
index 100 200 300
0 283.1 0.01 0.02 0.40
1 284.1 0.02 0.03 0.42
2 285.1 0.05 0.01 0.80
3 286.1 0.06 0.02 0.90
现在,计算数据帧的长度
N = len(df.index)
N
4
我们创建一个grp
列 - 用于聚合,
其中for 2 rows
聚合使用[x ]*2
而n-consecutive rows
聚合使用[x]*n
df['grp'] = list(itertools.chain.from_iterable([x]*2 for x in range(0, N/2)))
df
index 100 200 300 grp
0 283.1 0.01 0.02 0.40 0
1 284.1 0.02 0.03 0.42 0
2 285.1 0.05 0.01 0.80 1
3 286.1 0.06 0.02 0.90 1
现在,通过将grp
列分组来获取方法 -
df.groupby('grp').mean()
index 100 200 300
grp
0 283.6 0.015 0.025 0.41
1 285.6 0.055 0.015 0.85
答案 1 :(得分:0)
一种简单的方法:
>>> print df
index 100 200 300
0 283.1 0.01 0.02 0.40
1 284.1 0.02 0.03 0.42
2 285.1 0.05 0.01 0.80
3 286.1 0.06 0.02 0.90
将DataFrame
分解为您想要的部分并找到相关列的mean
:
>>> pieces = [df[:2].mean(), df[2:].mean()]
然后使用concat将这些碎片重新组合在一起:
>>> avgdf = pd.concat(pieces, axis=1).transpose()
index 100 200 300
0 283.6 0.015 0.025 0.41
1 285.6 0.055 0.015 0.85
或者,您可以使用列表推导[i for i in pieces]
或生成器表达式重新组合数据:
>>> z = (i for i in pieces)
并使用此功能创建新的DataFrame
:
>>> avgdf = pd.DataFrame(z)
最后,设置索引:
>>> avgdf.set_index('index', inplace=True)
>>> print avgdf
100 200 300
index
283.6 0.015 0.025 0.41
285.6 0.055 0.015 0.85