到目前为止,我已找到this question,但由于以下事实,它无法解决我的问题:
len()
我有以下DataFrame
Outer Inner Value
A 1 2.000000
A 2 4.000000
A 3 6.000000
A 4 8.000000
B 1 3.000000
B 2 6.000000
B 3 9.000000
B 4 12.000000
B 5 15.000000
我想以非重叠的方式对每个outer
的最后两个值求和。因此,对于A
,我想总结inner
的3 + 4,1 + 2.对于B
,我想要求inner
的4 + 5,2 + 3注意,成对和应该从最后一个值开始。导致
Outer Inner Value
A 2 6.000000
A 4 14.000000
B 3 15.000000
B 5 27.000000
答案 0 :(得分:2)
您很可能需要自定义重新取样才能执行此操作。这有点 hacky 但可能有用。
MulitIndex
以处理常规列groupby()
s groupby()
'Outer'
和.apply()
每个群组的自定义功能resample(...)
.sum()
resample(...)
Inner
每两位重新对.last()
列进行重新取样,以保留原始索引号Inner'
MultiIndex
,MultiIndex
groupby(...).apply()
醇>
注意:
rolling
存在问题,因为它幻灯片通过值而不是单步执行值(在非重叠方法中)。使用resample
可以实现此目的。重新采样是基于时间的,索引需要表示为秒。
import math
import pandas as pd
df = pd.DataFrame({
'Outer': ['A','A','A','A','B','B','B','B','B'],
'Inner': [1,2,3,4,1,2,3,4,5],
'Value': [2.00,4.00,6.00,8.00,3.00,6.00,9.00,12.00,15.00]
})
def f(g):
even_length = int(2.0 * math.floor(len(g) / 2.0))
every_two_backwards = g.iloc[-even_length:]
every_two_backwards.index = pd.TimedeltaIndex(every_two_backwards.index * 1000000000.0)
resample_via_sum = every_two_backwards.resample('2s').sum().dropna()
resample_via_sum['Inner'] = every_two_backwards.resample('2s').last()
resample_via_sum = resample_via_sum.set_index('Inner')
return resample_via_sum
resampled_df = df.groupby(['Outer']).apply(f)
print resampled_df
Value
Outer Inner
A 2.0 6.0
4.0 14.0
B 3.0 15.0
5.0 27.0
答案 1 :(得分:0)
好的,卷起袖子,这需要一些工作:
foo bar baz