我有一个配置,使用loc和iloc的组合来修改数据框的值非常有用。
df = pd.DataFrame([[1,2],[1,3],[1,4],[2,6],[2,5],[2,7]],columns=['A','B'])
基本上,在上面的数据框中,我只想获取等于某个值(即A = 2)的列。会给出:
A B
3 2 6
4 2 5
5 2 7
然后修改第二个索引的B的值(在这种情况下,实际上是索引4) 我可以使用以下命令访问所需的值:
df.loc[df['A'] == 2,'B'].iat[1]
(或.iloc而不是.iat,但我听说要更改很多单行,iat会更快)
它产生了我:5
但是我似乎无法使用同一命令对其进行修改:
df.loc[df['A'] == 2,'B'].iat[1] = 0
它给了我:
A B
0 1 2
1 1 3
2 1 4
3 2 6
4 2 5
5 2 7
我想要这个:
A B
0 1 2
1 1 3
2 1 4
3 2 6
4 2 0
5 2 7
谢谢!
答案 0 :(得分:2)
我们不应链接.loc
和.iloc
(iat
,at
)
df.loc[df.index[df.A==2][1],'B']=0
df
A B
0 1 2
1 1 3
2 1 4
3 2 6
4 2 0
5 2 7
答案 1 :(得分:0)
您可以使用cumsum
来计算实例数:
s = df['A'].eq(2)
df.loc[s & s.cumsum().eq(2), 'B'] = 0
输出:
A B
0 1 2
1 1 3
2 1 4
3 2 6
4 2 0
5 2 7