熊猫使用具有重复索引的loc更新值

时间:2020-07-22 13:31:19

标签: python pandas dataframe

全部

我有一个重复索引的数据框。我正在尝试使用具有该索引的所有行的索引来更新值。这是我所拥有的例子

  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

这可以工作,但是感觉有点笨拙,我忍不住认为有更好的(而且必须更快)的解决方案...

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