python - numpy 的 ones_like 的 pandas 版本

标签 python pandas numpy

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

相关文章:

python - 在Python中,如何对一手扑克(列表)进行排序并检测它是顺子还是皇家同花顺

python - 如何在 Python 中创建匹配以下内容的正则表达式?

numpy - 使用 scipy 的低通冷杉滤波器参数

python - 如何解决 Jupyter Notebook 中 No module named 'hmmlearn' 错误

python - 在 Pandas 中写入文件的问题

python - 有效地重新计算维数未知的 numpy 数组的梯度

python - 从列表中删除标点符号

python - 如何将字符串转换为二进制?

python - MultiIndex 上列级别上的 Pandas GroupBy 和 max

python - 如何根据连续行中的字符串填充df中的空白单元格,Pandas