Метод pandas.Series, который возвращает обновленную серию - PullRequest
0 голосов
/ 07 декабря 2018

Существует ли метод Series, который действует как обновление, но возвращает обновленную серию вместо обновления на месте?

Другими словами, есть ли лучший способ сделать это:

# Original series
ser1 = Series([10, 9, 8, 7], index=[1,2,3,4])

# I want to change ser1 to be [10, 1, 2, 7]
adj_ser = Series([1, 2], index=[2,3])

adjusted = my_method(ser1, adj_ser)

# Is there a builtin that does this already?
def my_method(current_series, adjustments):
    x = current_series.copy()
    x.update(adjustments)
    return(x)

Ответы [ 4 ]

0 голосов
/ 07 декабря 2018

Вот еще один способ:

adjusted = ser1.mask(ser1.index.isin(adj_ser.index), adj_ser)
adjusted

Вывод:

1    10
2     1
3     2
4     7
dtype: int64
0 голосов
/ 07 декабря 2018

Нет встроенной функции, кроме update, но вы можете использовать mask с логическим рядом:

def my_method(current_series, adjustments):
    bools = current_series.index.isin(adjustments.index)
    return current_series.mask(bools, adjustments)

Однако, какпроцесс маскирования вводит промежуточные значения NaN, ваша серия будет повышена до float.Таким образом, ваше update решение является лучшим.

0 голосов
/ 07 декабря 2018

Одно из возможных решений должно быть combine_first, но оно обновляет adj_ser на ser1, а также приводит к целым числам float s:

adjusted = adj_ser.combine_first(ser1)
print (adjusted)
1    10.0
2     1.0
3     2.0
4     7.0
dtype: float64
0 голосов
/ 07 декабря 2018

@ Никсон прав, что iloc и loc хороши для такого рода вещей

import pandas as pd
# Original series
ser1 = pd.Series([10, 9, 8, 7], index=[1,2,3,4])
ser2 = ser1.copy()
ser3 = ser1.copy()

# I want to change ser1 to be [10, 1, 2, 7]

# One way
ser2.iloc[1:3] = [1,2]
ser2 # [10, 1, 2, 7]


# Another way
ser3.loc[2, 3] = [1,2]
ser3 # [10, 1, 2, 7]

Почему два разных метода?

Как этот пост довольно хорошо объясняет, главное различие между loc и iloc - это метки против позиции.Моя личная запись - если вы пытаетесь внести коррективы на основе позиции с нулевым индексом значения, используйте iloc, иначе loc.YMMV

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...