#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]