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
谢谢你。
解决方案
给定相同的行选择,您可以通过提供值列表为多个列(对于所有这些行)设置单独的静态值。
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]
推荐阅读
- c# - 如何使用标签在面板框内书写?
- html - 导航栏上的 CSS 自动换行
- scala - Spark:如何使用 RowEncoder 创建流式数据集?
- angular - Angular 2+ / Ionic 2+ 将数据传递给未绑定的子组件
- url - 使用 Web Safe URL 标题检索表中的数据
- sql-server - 将多个 CSV 文件从具有附加文件名的文件夹导入 SQL Server 作为附加列
- php - PHP - 处理空函数/方法参数的最佳方法是什么?
- vba - 设置范围不起作用
- vba - 如何在vba中合并循环中的单元格?
- java - 属性名称包含特殊单词的 Spring Data JPA 存储库方法