簡體   English   中英

Pandas:在類型為列表的列上應用過濾器功能

[英]Pandas: Applying filter function on column which type is a list

所以我的問題是,我已經用列 ('Interval_range') 創建了 DF,它從其他兩列('Start_interval 和'End_interval')中壓縮值並創建第三個(Interval_range'),它的類型是一個列表。 現在,我想創建第四個 ('Absolute_frequency'),它計算外部列表 ('dataset') 中的所有值,這些值大於 'Interval_range' 列的第一個參數,小於 'Interval_range' 的第二個參數' 柱子。 我怎樣才能做到這一點? 我試圖使用 .apply() 然后 filter() 但最后我什么也沒得到。 這是我的所有代碼:

dataset= [8,30,30,50,86,94,102,110,169,170,176,236,240,241,242,255,262,276,279,282]

interval = (max(dataset)-min(dataset))/6

int1 = [round(min(dataset),2),round(min(dataset)+interval,2)]
int2= [round(int1[1],2),round(int1[1]+interval,2)]
int3 =[round(int2[1],2),round(int2[1]+interval,2)]
int4 =[round(int3[1],2),round(int3[1]+interval,2)]
int5 =[round(int4[1],2),round(int4[1]+interval,2)]
int6 =[round(int5[1],2),round(max(dataset),2)]

intervals = [int1,int2,int3,int4,int5,int6]

analiza = pd.DataFrame(intervals,index='A B C D E F'.split(),columns='Start_interval End_interval'.split())
analiza['Interval_range'] = list(zip(analiza['Start_interval'],analiza['End_interval']))

如果將dataset轉換為numpy數組,則可以遍歷'Interval_range'列並使用apply()lambda表達式檢查值是否在元組范圍內

dataset = [8, 30, 30, 50, 86, 94, 102, 110, 169, 170, 176, 236, 240, 241, 242, 255, 262, 276, 279, 282]
arr = np.array(dataset)
....
analiza['Absolute_frequency'] = analiza['Interval_range'].apply(lambda x: ((x[0] <= arr) & (arr <= x[1])).sum())

輸出

   Start_interval  End_interval    Interval_range  Absolute_frequency
A            8.00         53.67      (8.0, 53.67)                   4
B           53.67         99.34    (53.67, 99.34)                   2
C           99.34        145.01   (99.34, 145.01)                   2
D          145.01        190.68  (145.01, 190.68)                   3
E          190.68        236.35  (190.68, 236.35)                   1
F          236.35        282.00   (236.35, 282.0)                   8

這些代碼行創建了一個名為“Absolute_frequency”的新列,並按照您的說明計算頻率。

analiza["Absolute_frequency"] = [None for i in range(len(analiza.index))]
def calculate_abs_freq(row):
    lower = row["Start_interval"]
    upper = row["End_interval"]
    counter = 0
    for data in dataset:
        if(data >= lower and data <= upper):
            counter += 1
    row["Absolute_frequency"] = counter
    return row

analiza = analiza.apply(calculate_abs_freq, axis = 1)
analiza

abs_frequency 結果

暫無
暫無

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

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