考虑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的someone_like的 Pandas 版本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40638285/