熊猫使用 loc 更改特定行的数据集值

Posted

技术标签:

【中文标题】熊猫使用 loc 更改特定行的数据集值【英文标题】:pandas change dataset value of a specific row using loc 【发布时间】:2021-08-31 10:05:55 【问题描述】:

我是编程新手,我正在使用 pandas 开发一个 python 项目 我想使用 .loc 更改数据集的每一行的值,但它似乎不起作用,想法是如果行等于 0,则使一行取 EOL 值,代码不带错误,但我的数据集在迭代后没有改变。代码如下:

for machines in telemetry_days['machineID']:
EOL = 365
i = 0

for row in telemetry_days['failure_comp1'].loc[(telemetry_days['machineID'] == machines)]:
    
    if (row != 0):
        EOL = row
      
    elif (row == 0):
        telemetry_days['failure_comp1'].loc[(telemetry_days['machineID'] == machines)].iloc[i] = EOL
    i = i + 1

我认为这是因为我使用的是 .iloc,所以它不会改变数据集中“failure_comp1”的值。但是我不知道如何在不使用 .iloc 的情况下从 .loc 获取特定行,如果有人有任何建议,我将不胜感激,谢谢 这是整个数据集的结构(不要介意 NaN): enter image description here 例如,这是我所拥有的(对于一台“机器”):

index failure_comp1
67    0
254   150
568   0
850   0
998   345

我希望它变成这样:

index failure_comp1
67    365
254   150
568   150
850   150
998 345

这是一个时间序列数据集,我想用它的生命周期结束时间(天数)标记机器的每个组件,我已经在它失败的日期标记了它,但我想标记它对于该特定组件的每一行。

【问题讨论】:

您是否只想将'failure_comp1' 列中的任何非0 替换为365? 提供一个样本数据集(只有几行)和您想要的输出。我不太明白你想要完成什么 需要使用 .loc 和/或 .iloc 吗? 我编辑了我的帖子,不,我不需要使用 loc 或 iloc,我尝试使用 .at() 但我也想不出办法,所以有什么办法很好。 阅读this你就会知道 【参考方案1】:

所以我不会遍历行(尽管您可以根据需要进行迭代,我也会展示该解决方案)。但我要做的是使用.groupby('macineID')。 1)然后将所有的0转换为nan。 2)向前填充nans。 3) 这会将第一个 0 保留为 nan,所以最后用 365 填充。

作为样本数据集给出:

import pandas as pd

telemetry_days = pd.DataFrame(
    'machineID':['11','22','33','44','11','22','33','44','11','22','33','44','11','22','33','44','11','22','33','44'],
    'failure_comp1':[0,2,45,0, 
                     150,150,232,0, 
                     0, 0, 0, 0, 
                     0, 12, 0, 0,
                     345, 12, 0, 0])

代码:

import pandas as pd
import numpy as np


telemetry_days['failure_comp1'] = telemetry_days['failure_comp1'].replace(0, np.nan)
telemetry_days['failure_comp1'] = telemetry_days.groupby('machineID', as_index=False)['failure_comp1'].ffill().fillna(365)

如果您想使用 .loc 或 .iloc:

我会这样做。我将遍历每个唯一的机器 ID,过滤数据帧以获取那些机器,然后遍历该子组。我也不会硬编码i(索引)。 .iteritems() 和或iterrows() 将为您返回索引值,因此请使用它。

for machines in telemetry_days['machineID'].unique():
    EOL = 365
   
    for i, row in telemetry_days[telemetry_days['machineID'] == machines]['failure_comp1'].iteritems():
        
        if (row != 0):
            EOL = row
          
        elif (row == 0):
            telemetry_days['failure_comp1'].iloc[i] = EOL

【讨论】:

以上是关于熊猫使用 loc 更改特定行的数据集值的主要内容,如果未能解决你的问题,请参考以下文章

何时更改生成序列化程序集值?

使用javascript将json数据集值拆分为数据表

返回数据集值给出错误

更改熊猫数据框中随机选择的行的顺序

熊猫切片不包括末端

Chart.js 从图例中删除数据集值的标签