熊猫更新选定的行



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

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?我怎样才能避免这种情况?

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

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

要更新这些行,请执行以下操作:

df.loc[df['b'] == 4, 'a'] = 99

这是一个替代方案。

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

最新更新