Как обновить несколько строк pandas с условием фильтрации за один вызов

#pandas

Вопрос:

У меня есть рабочий код ниже, и мне нужна помощь, чтобы преобразовать его в гораздо более простое обновление:

 LastRun = datetime.today().strftime('%Y-%m-%d-%H:%M:%S')
NoOfRows = str(diagnostic_data.NoOfRows) 
NoOfCols = str(diagnostic_data.NoOfCols) 

df.loc[df.RuleID == str(ruleID), "LastRun"] = LastRun
df.loc[df.RuleID == str(ruleID), "NoOfRows"] = NoOfRows
df.loc[df.RuleID == str(ruleID), "NoOfCols"] = NoOfCols
 

Я попробовал приведенный ниже код, но вместо этого он удаляет данные, превращая их в Nan.

 col_name = ["LastRun","NoOfRows","NoOfCols"]
col_data = [LastRun,NoOfRows,NoOfCols]
df.loc[df.RuleID == str(ruleID), col_name] = pd.DataFrame([col_data], index=df.loc[df.RuleID == str(ruleID)].index)
 

Запущенная диагностика:

 df.loc[df.RuleID == str(ruleID), col_name]
>>       LastRun NoOfRows NoOfCols
>>    16     NaN      NaN      NaN

pd.DataFrame([col_data], index=df.loc[df.RuleID == str(ruleID)].index)
>>                          0  1    2
>>    16  2021-04-14-11:01:28  2  100
 

Спасибо.

Ответ №1:

При одном и том же выборе строки вы можете задать отдельные статические значения для нескольких столбцов (для всех этих строк), предоставив список значений.

 import pandas as pd
df = pd.DataFrame({'col1': [1,2,1,3,4], 
                   'foo': list('abcde'),
                   'bar': list('ABCDE')})

m = df['col1'].eq(1)
df.loc[m, ['foo', 'bar']] = ['foo1', 'bar1']

#   col1   foo   bar
#0     1  foo1  bar1
#1     2     b     B
#2     1  foo1  bar1
#3     3     d     D
#4     4     e     E
 

Так что в вашем случае вы бы сделали:

 df.loc[df.RuleID == str(ruleID), ['LastRun', 'NoOfRows', 'NoOfCols']] = [LastRun, NoOfRows, NoOfCols]