调整DataFrame的第一行,符合条件的条件

2024-06-02 11:43:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下所示的数据帧

import pandas as pd 
df = pd.DataFrame(data={"ID":[11,12,13,14,25],\
"Name":["Alice","Bob","Charlie", "Dan", "Erin"], "X":[1,0,0,0,0]})

   ID     Name  X
0  11    Alice  1
1  12      Bob  0
2  13  Charlie  0
3  14      Dan  0
4  25     Erin  0

我想选择X为0的第一行,并将值更改为1

df[df["X"]==0]["X"].iloc[0] = 1

但这似乎根本没有修改数据帧df。这对我来说很奇怪,因为我没有收到任何错误消息,而且删除=1会产生错误

>>> df[df["X"]==0]["X"].iloc[0]
 0

一如预期

我怀疑条件作用会创建数据帧的副本,因此数据帧df根本就不会被修改

实现这一目标的最佳方式是什么

   ID     Name  X
0  11    Alice  1
1  12      Bob  1
2  13  Charlie  0
3  14      Dan  0
4  25     Erin  0

当然,这需要系统地完成,因为我需要迭代这个过程

非常感谢你的帮助


Tags: 数据nameimportidpandasdfas错误
2条回答

我将使用idxmax

df.loc[df.X.eq(0).idxmax(),'X']=1
df
Out[153]: 
   ID     Name  X
0  11    Alice  1
1  12      Bob  1
2  13  Charlie  0
3  14      Dan  0
4  25     Erin  0

对标量设置使用^{}/^{}

困难是因为您希望将位置行索引与基于标签的列索引混合使用。选择一个,并坚持它的行和列

您可以全程使用标签,类似于@Wen's solution,但通过at

df.at[df['X'].eq(0).idxmax(), 'X'] = 1

或者您可以通过iat对整型位置进行索引:

df.iat[df['X'].eq(0).values.argmax(), df.columns.get_loc('X')] = 1

两种解决方案产生相同的结果。前者更有可读性

print(df)

   ID     Name  X
0  11    Alice  1
1  12      Bob  1
2  13  Charlie  0
3  14      Dan  0
4  25     Erin  0

^{}/^{}是矢量化的,但不是特别有效。如果效率是一个问题,请参见Efficiently return the index of the first value satisfying condition in array

相关问题 更多 >