考虑 pd.Series
s
s = pd.Series([.4, .5, .6], list('abc'))
s
a 0.4
b 0.5
c 0.6
dtype: float64
我以前做过这个以获得一系列的
pd.Series(np.ones_like(s.values), s.index, name=s.name)
a 1.0
b 1.0
c 1.0
dtype: float64
什么是更好的方法?
最佳答案
您可以使用 Series.copy
并通过禁用它的 deep
参数来加速整个过程。稍后,使用 ndarray.fill
用 1 填充系列中存在的所有这些值。
我们拿一个DF
来说明它的值被Nan
填了一半:
np.random.seed(42)
df = pd.DataFrame(np.random.randn(10**6,), columns=['A'])
# Populate values with Nans
df.loc[df.sample(frac=0.5).index] = np.NaN
df.shape
# (1000000, 1)
def fill_ones_with_modify():
ser = df['A'].copy(deep=False) # use copy() → without modifying the original DF
ser.values.fill(1)
return ser
%timeit fill_ones_with_modify()
1000 loops, best of 3: 837 µs per loop
注意:这对系列操作 inplace
,因此 DF
的结果系列将是也改变了(用 1 填充)。
另一种方法是将系列作为 DF
的单个列进行访问,并在复制后将其展平以返回一个系列对象。然而,这需要更多时间,因为基础数据和索引已被复制。 上行 - 不修改引用的系列对象。
def fill_ones_without_modify():
ser = df[['A']].copy(deep=False).squeeze()
ser.values.fill(1)
return ser
%timeit fill_ones_without_modify()
100 loops, best of 3: 6.4 ms per loop
关于python - numpy 的 ones_like 的 pandas 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40638285/