2014-04-15 50 views
0

我正在嘗試在大型數據幀(〜300萬行)上執行多個操作。
使用一個代表我的數據的小測試集,我提出了一個解決方案。
但是,當使用大型數據集作爲輸入時,腳本運行速度非常緩慢。
在熊貓組上運行

這裏是應用程序的主循環:

def run(): 
    df = pd.DataFrame(columns=['CARD_NO','CUSTOMER_ID','MODIFIED_DATE','STATUS','LOYALTY_CARD_ENROLLED']) 

    foo = input.groupby('CARD_NO', as_index=False, sort=False) 

    for name, group in foo: 
     if len(group) == 1: 
      df = df.append(group) 
     else: 
      dates = group['MODIFIED_DATE'].values 
      if all_same(dates): 
       df = df.append(group[group.STATUS == '1']) 
      else: 
       df = df.append(group[group.MODIFIED_DATE == most_recent(dates)]) 

    path = '' 
    df.to_csv(path, sep=',', index=False) 

的邏輯如下:
對於每個CARD_NO
- 如果只有1 CARD_NO,添加行到新數據幀
- 如果有相同的CARD_NO> 1,則檢查MODIFIED_DATE,
- 如果MODIFIED_DATE不同,則取最近日期的行
- 如果所有MODIFIED_DATES均爲eq UAL,採取取其行有STATUS = 1

發生在身邊每個迭代的放緩,

input.groupby('CARD_NO', as_index=False, sort=False) 

目前我正在試圖通過拆分通過上面的語句返回的組並行化循環,但我不確定這是否是正確的方法...

我是否忽略了熊貓的核心功能?
有沒有更好的,更多熊貓式的解決這個問題的方法?

任何幫助,非常感謝。
謝謝。

+0

你從哪裏讀取數據?它是一個CSV文件? – nitin

+0

是的。它大小約爲145mb。 – Zihs

+0

不斷追加效率不高;將每個組的生成幀附加到列表中; concat在最後 – Jeff

回答

0

我在運行時間寫了顯著的改善。 return語句似乎改變了數據幀的位置,顯着改善了運行時間(約300萬行約30分鐘),並避免了對二級數據結構的需要。

def foo(df_of_grouped_data): 
    group_length = len(df_of_grouped_data) 

    if group_length == 1: 
     return df_of_grouped_data 
    else: 
     dates = df_of_grouped_data['MODIFIED_DATE'].values 
     if all_same(dates): 
      return df_of_grouped_data[df_of_grouped_data.STATUS == '1'] 
     else: 
      return df_of_grouped_data[df_of_grouped_data.MODIFIED_DATE == most_recent(dates)] 

result = card_groups.apply(foo) 
0

兩個一般提示:

  1. 對於遍歷一個GROUPBY對象,你可以嘗試apply。例如,

    grouped = input.groupby('CARD_NO', as_index=False, sort=False)) 
    grouped.apply(example_function) 
    

    在此,example_function針對groupby對象中的每個組被調用。您可以編寫example_function來自己附加到數據結構,或者如果它有返回值,pandas會嘗試將返回值連接成一個數據幀。

  2. 將行附加到數據框很慢。在循環的每次迭代中構建其他數據結構,然後在最後構建數據框可能會更好。例如,你可以製作一個字典列表。

    data = [] 
    grouped = input.groupby('CARD_NO', as_index=False, sort=False) 
    
    
    def example_function(row,data_list): 
        row_dict = {} 
        row_dict['length'] = len(row) 
        row_dict['has_property_x'] = pandas.notnull(row['property_x']) 
        data_list.append(row_dict) 
    
    grouped.apply(example_function, data_list=data) 
    pandas.DataFrame(data)