1

我有 2 列的值,我只想更新 1 行的第三列。

我有-

df = pd.DataFrame({'A':[1,1,2,3,4,4],
                   'B':[2,2,4,3,2,1],
                   'C':[0] * 6})
print (df)
   A  B  C
0  1  2  0
1  1  2  0
2  2  4  0
3  3  3  0
4  4  2  0
5  4  1  0

如果 A= 1 且 B=2 则只有第一行的 C=1 像这样 -

print (df)
   A  B  C
0  1  2  1
1  1  2  0
2  2  4  0
3  3  3  0
4  4  2  0
5  4  1  0

现在我用过

df.loc[(df['A']==1) & (df['B']==2)].iloc[[0]].loc['C'] = 1

但它不会改变数据框。

4

2 回答 2

2

如果匹配总是至少一行的解决方案:

创建布尔掩码并设置为第一个True索引值idxmax

mask = (df['A']==1) & (df['B']==2)

df.loc[mask.idxmax(), 'C'] = 1

但是如果没有匹配的值idxmax返回第一个False值,则添加if-else

mask = (df['A']==1) & (df['B']==2)

idx = mask.idxmax() if mask.any() else np.repeat(False, len(df))
df.loc[idx, 'C'] = 1
print (df)
   A  B  C
0  1  2  1
1  1  2  0
2  2  4  0
3  3  3  0
4  4  2  0
5  4  1  0

mask = (df['A']==10) & (df['B']==20)

idx = mask.idxmax() if mask.any() else np.repeat(False, len(df))
df.loc[idx, 'C'] = 1
print (df)
   A  B  C
0  1  2  0
1  1  2  0
2  2  4  0
3  3  3  0
4  4  2  0
5  4  1  0
于 2019-01-16T08:05:11.820 回答
0

用于pd.Series.cumsum确保仅满足第一个匹配条件:

mask = df['A'].eq(1) & df['B'].eq(2)
df.loc[mask & mask.cumsum().eq(1), 'C'] = 1

print(df)

   A  B  C
0  1  2  1
1  1  2  0
2  2  4  0
3  3  3  0
4  4  2  0
5  4  1  0

如果性能是一个问题,请参阅高效返回数组中满足条件的第一个值的索引

于 2019-01-16T10:05:56.903 回答