是否有一个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)
答案 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是正确的,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]
为什么有两种不同的方法?
正如this post很好解释的那样,loc
和iloc
之间的主要区别在于标签与位置。我的个人缩写是,如果您尝试根据值的零索引位置进行调整,请使用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