Pandas更新选定的行

时间:2018-04-09 21:50:07

标签: python pandas

我想更新与选择器匹配的行。这基本上就是我想要的行为。

def select_rows(df, selector):
    return df.loc[(df[list(selector)] == pd.Series(selector)).all(axis=1)]

def update_matching(df, selector, update):
    selected = select_rows(df, selector)
    updated = selected.assign(**update)
    result = updated.combine_first(df)
    return result


df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})

select_rows(df, {'b': 4})
# :    a  b
# : 1  2  4

update_matching(df, {'b': 4}, {'a': 99})
# :       a    b
# : 0   1.0  3.0
# : 1  99.0  4.0
  1. 有更简单的方法吗?
  2. 为什么类型会从int更改为float?我怎么能避免这个?

2 个答案:

答案 0 :(得分:0)

这是另一种选择。

def select_indexes(df, selector):
  return (df[list(selector)] == pd.Series(selector)).all(axis=1)


def update_matching(df, selector, update):
    new = df.copy()
    update_keys, update_values = zip(*update.items())
    rows = select_indexes(new, selector)
    new.loc[rows, update_keys] = update_values
    return new

答案 1 :(得分:0)

确实有一种更简单的方法可以根据列值选择行:

<div class="container">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus vitae mollis nisi. Mauris vestibulum ac lacus ac vulputate. Maecenas molestie ex dolor, et aliquet augue varius sit amet. Vivamus eleifend nisl nulla, a pellentesque ipsum pharetra eget. Curabitur tincidunt non nibh vitae convallis. Nunc magna 
<div class="overlay"></div>
</div>

并更新这些行:

df[df['b'] == 4]