Измените 1-ую строку данных в соответствии с условием в пандах - PullRequest
0 голосов
/ 16 января 2019

У меня есть 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, то только 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

Прямо сейчас я использовал

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

но он не вносит изменений во весь фрейм данных.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Использование pd.Series.cumsum для обеспечения соответствия только критерию соответствия first :

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

Если производительность имеет значение, см. Эффективно вернуть индекс первого значения, удовлетворяющего условию в массиве .

0 голосов
/ 16 января 2019

Решение, если всегда совпадает хотя бы одна строка:

Создание логической маски и установка первого 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
...