【问题标题】:best way to iterate and update pandas dataframe迭代和更新熊猫数据框的最佳方法
【发布时间】:2018-01-16 16:07:19
【问题描述】:

希望得到一些帮助。我有一个数据框,它以 State & Level 列开始,仅当 Signal 列 = True 时才具有值,否则值为 None 和 0.0。 Signal = True 时的 State 初始值只能是 Neutral 或 Low,这由 Low 列的值决定(0 = Neutral,1= Low)。 温度信号状态低中高电平 217.46 错误 无 1 1 0
217.09 错误 无 0 1 0
216.55 错误 无 0 0 0
216.66 真 低 1 0 1 216.49 216.86 错误 无 1 0 0
216.94 错误 无 1 0 0
216.73 错误 无 0 1 0
216.9 错误 无 1 0 1
216.5 错误 无 0 0 1
216.89 错误 无 1 1 1
216.29 错误 无 0 1 1
215.69 错误 无 0 1 0
214.97 错误 无 0 0 0
215.3 真 中性 0 0 1 214.97 215.06 错误 无 0 0 0
215.21 错误 无 1 0 0
214.86 错误 无 1 0 0
214.88 错误 无 0 1 0
214.85 错误 无 0 1 0
215.27 错误 无 1 0 0

我想要做的是遍历行以根据 State 的先前值和 Low、Mid、High 值更新 State 列。

如果初始状态值 = 中性,那么它只能在当前行的低列值 = 1 其中状态 = '低' 或 Temp

如果初始状态值 = "Low",则只有在当前行 Low 列值 = 0 且 Mid 列 = 1 时才能更改为 "Mid",否则如果 Low 列的当前值 = 1,则该值将继续为“低”。如果 Low 和 Mid 列值都 = 0,则 State 的值 = 'X'。

同样的逻辑适用于从“中”到“高”状态列值的移动。 "Mid" 只有在 Mid 列的当前值 = 0 和 High 列 = 1 时才能更改为 'High'。如果两者都是 = 0 则 State 的值 = 'X'

X 充当循环结束标志。在另一个 Signal = True 出现之前,无需进一步分析。

以下是预期输出的示例。如您所见,您不能仅向前返回状态(即从中到低或从高到中),并且仅当当前状态列(低,中,高)值从 1 移动到 0 并且下一个值等于 t0 时1. 你不能在一次迭代中跳转多个状态(即从低到高)。

温度信号状态 Low Mid High Level 217.46 错误 无 1 1 0
217.09 错误 无 0 1 0
216.55 错误 无 0 0 0
216.66 真 低 1 0 1 216.49 216.86 FALSE 低 1 0 0
216.94 FALSE 低 1 0 0
216.73 假中 0 1 0
216.9 假高 1 0 1
216.5 FALSE 高 0 0 1
216.89 假高 1 1 1
216.29 FALSE 高 0 1 1
215.69 错误 X 0 1 0
214.97 错误 无 0 0 0
215.3 真 中性 0 0 1 214.97 215.06 FALSE 中性 0 0 0
215.21 FALSE 低 1 0 0
214.86 FALSE 低 1 0 0
214.88 假中 0 1 0
214.85 假中 0 1 0
215.27 假 X 1 0 0

所以我的问题是如何最好地处理这个问题,我有大约 100,000 行数据需要处理。索引从 0 开始编号。我可以使用 .iterrows 假设,甚至不确定它是否会起作用,因为我需要访问 State 的先前值来确定当前的 State 值。我是熊猫新手,不知道这是否是最好的方法。速度对我来说有点担心。

我开始使用类似的东西,但它会变成一些超级意大利面条代码,并混合一些肉丸! :)

for i, row in df.iterrows():
    if (i>1) and (df.loc[i-1,'State'] == 'Neutral')  and (df.loc[i,'Level']  < df.loc[i,'Temp']):
        if (df.loc[i,'Low']== 0):
            new_State = 'Neutral'
        else:
            new_State = 'Low'
        df.loc[i,'State'] = new_State

【问题讨论】:

    标签: pandas iteration


    【解决方案1】:

    您可以通过这种方式更新 pandas 数据框。

    a = 0  
    for index, row in df.iterrows():  
      df.iloc[a, df.columns.get_loc('B_lat')] = "Values"  
      a = a + 1
    

    df.loc[] 更新特定值。例如,“a”定义行数,“df.columns.get_loc('B_lat')”定义列。右侧值在特定单元格处更新。

    【讨论】:

    • 这是否比使用 .iterrows() 更有效?
    猜你喜欢
    • 2013-10-23
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 2021-10-10
    • 2020-05-17
    • 2015-12-09
    • 2014-06-13
    相关资源
    最近更新 更多