python - 如何用 Python 中更快的选项替换 for 循环

标签 python pandas

我有两个数据框,大约有 10 000 行。它们与下面的 a 和 b 类似,但行数更多。

 a
 Out[9]: 
     end  start
 0   4.0      3
 1   5.5      5
 2   7.5      7
 3   9.5      9
 4  11.5     11
 5  15.0     14
 6  18.0     17
 7  21.0     20
 8  26.0     25
 9  31.0     30

 b
 Out[10]: 
        status
 moment       
 8.0         o
 10.0        o
 14.5        o
 16.0        o
 19.0        o
 27.0        o
 28.0        o
 30.5        o
 35.0        o
 40.0        o
 50.0        o

我必须找到数据帧 b 中属于数据帧 a 的结束和开始之间的所有时刻。

我为此开发了 for 循环,它适用于小型数据帧。

 for r in a.index:    
     for k in b.index:
         if a.ix[r,'start'] <k and k <a.ix[r,'end']:
             b.ix[k,'status']='m' # replaces m to o if moment is in between start and end

下面你可以看到当时刻介于开始和结束之间时 for 循环如何替换 o -> m。

 n [12]: b
 Out[12]: 
        status
 moment       
 8.0         o
 10.0        o
 14.5        m
 16.0        o
 19.0        o
 27.0        o
 28.0        o
 30.5        m
 35.0        o
 40.0        o
 50.0        o

当我尝试将它用于巨大的数据帧(数据帧中超过 10000 行)时,它无法在合理的时间内获得结果。

您有什么想法可以更快地阐述我的 for 循环并使其适用于更长的数据帧吗?

最佳答案

这是一个没有for循环的选项,它没有避免向量扫描,而是被向量化了:

b[b.index.map(lambda m: ((m > a.start) & (m < a.end)).any())] = "m"

b

#   status
# moment    
# 8.0   o
# 10.0  o
# 14.5  m
# 16.0  o
# 19.0  o
# 27.0  o
# 28.0  o
# 30.5  m
# 35.0  o
# 40.0  o
# 50.0  o

关于python - 如何用 Python 中更快的选项替换 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39166546/

相关文章:

python - 有没有办法在 Seaborn 直方图中显示色调类别内的概率

python - Pandas Dataframe MultiIndex 将多索引的一个级别转换到另一个轴,同时保留原始轴中的另一个级别

python - 将 Object dtype 列转换为数据框 Pandas 中的 Number Dtype

python - Pandas 中的多索引 fillna

Python - threading.Timer 在调用 cancel() 方法后保持事件状态

Python 循环(在列表中的 dermined 位置插入项目)

python - pip install 如何知道要安装哪些依赖项?

python - 使用反斜杠将字符串列表转换为正确的目录名称

python - Google App Engine、Python、删除 cookie 或更改其值?

scipy - 将一组 Pandas Series reshape 为 DataFrame 并填充缺失值