考虑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/

10-12 22:19
查看更多