Python 根据条件修改数据帧的第一行
我有一个如下所示的数据框架Python 根据条件修改数据帧的第一行,python,pandas,indexing,series,Python,Pandas,Indexing,Series,我有一个如下所示的数据框架 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
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
当然,这需要系统地完成,因为我需要迭代这个过程
非常感谢您的帮助。我将使用
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
使用/进行标量设置
出现困难是因为您希望将位置行索引与基于标签的列索引混合使用。选择一个,并在行和列中使用它
您可以在整个过程中使用标签,类似于但通过在
:
df.at[df['X'].eq(0).idxmax(), 'X'] = 1
df.iat[df['X'].eq(0).values.argmax(), df.columns.get_loc('X')] = 1
或者,您可以通过iat
对整型位置索引进行索引:
df.at[df['X'].eq(0).idxmax(), 'X'] = 1
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
/是矢量化的,但不是特别有效。如果效率是一个问题,请参见。与我将要发布的内容非常相似:
df.loc[df['X'].ne(1.idxmax(),'X']=1