首页 > 解决方案 > 如何在一次调用中使用过滤条件更新多个 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

谢谢你。

标签: pandas

解决方案


给定相同的行选择,您可以通过提供值列表为多个列(对于所有这些行)设置单独的静态值。

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]

推荐阅读