【问题标题】:More efficient way to assign group for each row in pandas为熊猫中的每一行分配组的更有效方法
【发布时间】:2020-02-25 00:22:18
【问题描述】:

我有一个包含 1000 多列的数据框,并且我有一个预定义的组列表。我想将每个单元格值与每个组边界进行比较,并创建一个新列来分配组名。我已经写了for loops,但处理它花了超过 5 分钟。有没有更有效的方法来实现这一目标?谢谢

这是我的数据框

Frequency
21.0
18.0    
16.0    
10.0
10.0    
9.0    
10.0    
10.0      
5.0       
8.0 

还有我预定义的组列表

> groups    
[(3, 5), (6, 10), (11, 30)]

我想得到的是

Frequency   Group
21.0        11-30
18.0        11-30
16.0        11-30
10.0        6-10
10.0        6-10
9.0         6-10
10.0        6-10
10.0        6-10
5.0         3-5
8.0         6-10

这是我的代码

for i in range(0, len(fre_table["Frequency"])):
    for j in range(0, len(groups)):
        if fre_table["Frequency"][i] >= groups[j][0] and fre_table["Frequency"][i] <= groups[j][1]:
            break
    fre_table['Group'][i] = "{}-{}".format(groups[j][0], groups[j][1])

【问题讨论】:

标签: python pandas dataframe for-loop


【解决方案1】:

建立@BallpointBen 在评论部分提出的解决方案的效率

数据:

import numpy as np
import pandas as pd

fre_table = pd.DataFrame({'Index':[0,1,2,3,4,5,6,7,8,9],
             'Frequency':[21.0, 18.0, 16.0, 10.0, 10.0, 9.0, 10.0, 10.0, 5.0, 8.0]})
groups = [(3, 5), (6, 10), (11, 30)]

初始解决方案所用时间:0.5420

import timeit
start_time = timeit.default_timer()
fre_table['Group'] = 0
for i in range(0, len(fre_table["Frequency"])):
    for j in range(0, len(groups)):
        if fre_table["Frequency"][i] >= groups[j][0] and fre_table["Frequency"][i] <= groups[j][1]:
            break
    fre_table['Group'][i] = "{}-{}".format(groups[j][0], groups[j][1])
elapsed_time = timeit.default_timer() - start_time

最终解决方案所需时间:0.0043s

import timeit
start_time = timeit.default_timer()
bins = pd.IntervalIndex.from_tuples(groups)
fre_table['Group'] = pd.cut(fre_table['Frequency'], bins)
elapsed_time = timeit.default_timer() - start_time

大约快 100 倍!

【讨论】:

    猜你喜欢
    • 2016-09-18
    • 2016-11-09
    • 2017-05-08
    • 1970-01-01
    • 2018-11-24
    • 2020-07-12
    • 2021-01-29
    • 2013-05-12
    • 1970-01-01
    相关资源
    最近更新 更多