代码之家  ›  专栏  ›  技术社区  ›  NothingToSeeHere

使用Dataframe保存python for循环中更新的值

  •  2
  • NothingToSeeHere  · 技术社区  · 7 年前

    我是Python和Pandas的新手,我试图用一个特定的值替换数组中的所有空值。

    我已经看到Pandas在迭代行时不保存更改…那么如何保存更改呢?

    animal_kinds = set(df.AnimalKind) # this gives categories used below in the "ak" like dog, cat, bird
    new_color_dog = 'polka dots'
    new_color_cat = 'plaid'
    new_color_bird = 'stripes'
    
    for ak in animal_kinds:
        ak_colors = ak['colors']
    
    
        ak_with_no_color = animals[(df["Kind"] == ak ) & (df["Color"] == "" ) ] 
    
    
        result_count = len(ak_with_no_color)
        if result_count:
    
            ak_with_no_color.at["Color"] = new_color_ak #sets new color based on kind of animal (ak) 
            print(str(ak) 'color is changed to ' + str(new_color_ak))
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   jpp    7 年前

    这种操作称为链式索引,它是 explicitly discouraged in the docs :

    df[(df['kind'] == 'dog') & (df['colour'] == '')].at['colour'] = 'black'
    

    相反,请计算并使用布尔掩码:

    mask = (df['kind'] == 'dog') & (df['colour'] == '')
    df.loc[mask, 'colour'] = 'black'
    

    使用字典查找可变数量的变量

    这种手术确实有效 使用Python:

    new_colour_dog = 'polka dots'
    new_colour+'_dog'  # want 'polka dots', but will not work
    

    new_colours = {'dog': 'polka dots', 'cat': 'plaid', 'bird': 'stripes'}
    

    然后可以迭代字典的键值对:

    for animal, new_colour in new_colours.items():
        mask = (df['kind'] == animal) & (df['colour'] == '')
        df.loc[mask, 'colour'] = new_colour
    

    您不需要在以下情况下测试/特殊情况实例: mask 返回一系列 False 价值观