2016-06-09 70 views
1

我有兩個數據框。第一個命名mergedcsv的格式爲: mergedcsv dataframepython dataframe groupby by dictionary list then sum

命名idgrp_df第二數據幀是一個字典的格式,其對於每個區域編號對應的字符串ID的列表。 idgrp_df dataframe - keys with lists

對於mergedcsv每一行(以及在idgrp_df相應行)我想mergedcsv其中列標籤等於列表與idgrp_df該行內選擇的列。然後對這些特定值的值進行求和並將輸出結果添加到mergedcsv中的一列中。該函數將遍歷mergedcsv中的所有行(582行x 600列)。

我行代碼來嘗試嘗試是這樣的:

mergedcsv['TotRegFlows'] = mergedcsv.groupby([idgrp_df],as_index=False).numbers.apply(lambda x: x.iat[0].sum()) 

它返回一個ValueError: Grouper for class pandas.core.frame.DataFrame not 1-dimensional.

這就涉及到了GROUPBY輸入數據幀。如何訪問每行的列表作爲groupby的輸入?

因此,例如,對於mergedcsv中的第一行,我希望選擇標籤爲F95RR04,F95RR06F95RR15(從第一行idgrp_df中的列表中讀取)的列。將這一行的這些列中的值相加,然後將總和值插入TotRegFlows列。

任何想法如何我可以利用列表將非常感激。

編輯:

非常感謝IanS。您的解決方案很有用。根據這條建議修改了代碼行之後,我意識到(如建議)我的兩個數據框中的索引都不同步。我測試了索引(mergedcsv有'None',idgrp_df有'REG_ID'列作爲索引,我也將mergedcsv設置爲'REG_ID',然後意識到mergedcsv有582行(REG_ID不唯一),idgrp_df有220行(REG_ID是唯一的)我爲此覺得我根據在mergedcsv REG_ID指數缺少GROUPBY 我已經修改了代碼如下:。

mergedcsv.set_index('REG_ID', inplace=True) 
    print mergedcsv.index.name 
    print idgrp_df.index.name 

    mergedcsvgroup = mergedcsv.groupby('REG_ID')[mergedcsv.columns].apply(lambda y: y.tolist()) 

    mergedcsvgroup['TotRegFlows'] = mergedcsvgroup.apply(lambda row: row[idgrp_df.loc[row.name]].sum(), axis=1) 

我有一個KeyError異常:「REG_ID」

任何進一步的建議是最受歡迎的。將groupby組合並應用於一行會更有效率嗎?

我是新來與大熊貓的工作,並試圖在Python積累經驗

進一步修訂:

如果沒有索引的mergedcsv:

​​

,這將引發一個KeyError異常:(標籤[0]不在[索引]中,u'在索引0處出現)

索引爲mergedcsv:

mergedcsv.set_index('REG_ID', inplace=True) 
columnlist = list(mergedcsv.columns.values) 
mergedcsv['TotRegFlows'] = mergedcsv.apply(lambda row: row[idgrp_df.loc[row.name]].groupby('REG_ID')[columnlist].transform().sum(), axis=1) 

,這將引發一個類型錯誤:( 「unhashable類型: '列表'」,在索引7' u'occurred)

或者最後分離GROUPBY功能:

columnlist = list(mergedcsv.columns.values) 
mergedcsvgroup = mergedcsv.groupby('REG_ID') 
mergedcsv['TotRegFlows'] = mergedcsvgroup.apply(lambda row: row[idgrp_df.loc[row.name]].sum()) 

這將引發TypeError:不可用類型列表。軸= 1參數也不適用於groupby應用。

任何想法如何使用應用函數列表?我已經在應用代碼中探索了元組,但沒有取得任何成功。

任何建議非常感謝。

+0

我的回答是否幫助您解決問題?隨意要求澄清! – IanS

+0

謝謝@IanS您的建議在比較兩個數據框時非常有用。我意識到第一個數據幀需要groupby。我編輯了原文,以反映這些變化。但仍有列表錯誤。任何進一步的建議將非常感激。 –

+0

第一個關鍵錯誤是因爲一旦您將'REG_ID'設置爲索引,該列就會被刪除,您不能再對其進行分組。你可以這樣做(使用'groupby(level = 0)'),但由於'REG_ID'不是唯一的,我不認爲這是個好主意。 – IanS

回答

0

如果我理解正確的話,我有apply一個簡單的解決方案:

設置

import pandas as pd 

df = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6], 'C': [7,8,9]}) 
lists = pd.Series([['A', 'B'], ['A', 'C'], ['C']]) 

解決方案

我申請一個lambda函數獲取列的列表可以從lists系列求和:

df.apply(lambda row: row[lists[row.name]].sum(), axis=1) 

訣竅是,當遍歷行(axis=1)時,row.name是數據幀df的原始索引。我使用它來訪問lists系列的列表。

注意

該解決方案假定兩個dataframes共享相同的指數,這似乎不是你包括屏幕截圖的情況。你必須解決這個問題。

此外,如果idgrp_df是數據幀而不是系列,則需要使用.loc訪問其值。