簡體   English   中英

為熊貓中的每一行分配組的更有效方法

[英]More efficient way to assign group for each row in pandas

我有一個包含 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])

在評論部分建立@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.0043s0.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 倍!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM