全部
我有一个重复索引的数据框。我正在尝试使用具有该索引的所有行的索引来更新值。这是我所拥有的例子
name x
t
0 A 5
0 B 2
1 A 7
2 A 5
2 B 9
2 C 3
每次都出现“ A”。我想用“ x”的当前值替换“ x”,减去当时“ A”的“ x”的值。棘手的部分是获取数组或数据框,在这种情况下
array([5, 5, 7, 5, 5, 5])
这是“ A”的值,但每个时间戳重复一次。然后,我可以从df ['x']中减去它。我的工作方法如下。
temp = df[df['name'] == 'A']
d = dict(zip(temp.index, temp['x']))
df['x'] = df['x'] - df.index.to_frame()['t'].replace(d)
name x
t
0 A 0
0 B -3
1 A 0
2 A 0
2 B 4
2 C -2
这可以工作,但是感觉有点笨拙,我忍不住认为有更好的(而且必须更快)的解决方案...
答案 0 :(得分:1)
我会做reindex
df.x-=df.loc[df.name=='A','x'].reindex(df.index).values
df
Out[362]:
name x
t
0 A 0
0 B -3
1 A 0
2 A 0
2 B 4
2 C -2
答案 1 :(得分:1)
groupby .cumsum()
,其中name =A
,然后从其余的各组中减去快速值
df['x']=df.groupby((df.name=='A').cumsum())['x'].apply(lambda s:s.sub(s.iloc[0]))
name x
t
0 A 0
0 B -3
1 A 0
2 A 0
2 B 4
2 C -2