返回更新系列的pandas.Series方法

时间:2018-12-07 15:10:46

标签: python pandas

是否有一个Series方法,其作用类似于update,但返回更新后的系列而不是就地更新?

换一种说法,有没有更好的办法做到这一点:

# 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 :(得分:1)

一个可能的解决方案应该是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

答案 1 :(得分:0)

@nixon是正确的,ilocloc对这种事情有好处

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]

为什么有两种不同的方法?

正如this post很好解释的那样,lociloc之间的主要区别在于标签与位置。我的个人缩写是,如果您尝试根据值的零索引位置进行调整,请使用iloc否则使用loc。 YMMV

答案 2 :(得分:0)

update以外没有内置函数,但是您可以将mask与布尔序列一起使用:

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

但是,由于屏蔽过程引入了中间NaN值,因此您的系列将被转换为float。因此,您的update解决方案是最好的。

答案 3 :(得分:0)

这是另一种方式:

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

输出:

1    10
2     1
3     2
4     7
dtype: int64