python - 在没有 for 循环的情况下基于另外两个系列填充一个系列

标签 python pandas numpy dataframe indexing

我有两个系列:s1 和 s2,填充了一年的每小时数据。我想创建另一个系列 s3,以便:

  • 如果对于特定的小时,s1> 0 且 s1 > s2,则 s3 = s1
  • 如果 s1 > 0 且 s1 <= s2, s3 = s2
  • 如果 s1 < 0, s3 = 0

所以我可以做类似的事情

for i in range(1,len(s1)):
    if (s1.iat[i] > 0 and s1.iat[i]>s2.iat[i]):
        s3.iat[i] = s1.iat[i]
    elif (s1.iat[i] > 0 and s1.iat[i]>s2.iat[i]):
        s3.iat[i] = s2.iat[i]
    else:
        s3.iat[i] = 0

但我确信有一种更优雅、希望更快的方法可以做到这一点。我已经尝试过许多使用 bool 索引和 numpy.where 的实现,但我不知道如何告诉 Python 执行“a[b>c]=b”。它似乎不喜欢逐行比较不同的数组。

最佳答案

map(lambda a: 0 if a[0]<0 else a[0] if a[0]>a[1] else a[1],  zip(s1,s2))

还有一些工作..

>>> s1=[-1,2,3,4,1,2,3,4]
>>> s2=[0,1,2,3,4,5,6,7]
>>> map(lambda a: 0 if a[0]<0 else a[0] if a[0]>a[1] else a[1], zip(s1,s2))
[0, 2, 3, 4, 4, 5, 6, 7]

这可能有助于解释..

>>> zip(s1,s2)
[(-1, 0), (2, 1), (3, 2), (4, 3), (1, 4), (2, 5), (3, 6), (4, 7)]

如果您采用上述内容并将其应用于您的代码...我不确定我这样做是否正确,因为我不知道 iat 是什么。

如果数组真的很大,我会将 zip 替换为 itertools.izip,因为那样会返回一个迭代器。

关于python - 在没有 for 循环的情况下基于另外两个系列填充一个系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46472985/

相关文章:

python - 检查同一列中是否有相似的字符串

python - 根据列选择 pandas 数据框中的数据

python - Numpy Interweave 奇怪形状的数组

python - 使用 numpy.searchsorted 后查找未排序的索引

python - 将 numpy uint8 数组转换为字符串

python - 将泊松分布拟合到 statsmodels 中的数据

python - 发现 numpy 多年来百分比变化减少

python - 让 AppEngine AppAssertionCredentials 正常工作 (Python)?

python - QTR-8RC 反射传感器阵列不返回数据

python - 使用 Numpy 和 Pandas 替换数据框中的缺失值并更新旧值