2013-10-29 174 views
1

我想將幾列數據添加到現有數據框中。數據框本身是從許多其他數據框構建的,我成功地加入了索引,這些索引是相同的。對於這一點,我用這樣的代碼:熊貓:根據列數據合併或加入數據框?

data = p_data.join(r_data) 

其實我加入這一個多指標,因此數據幀看起來像以下,其中名稱1和名稱2指數:

Name1 Name2 present r  behavior 
    a  1  1   0  0 
      2  1   .5  2 
      4  3   .125 1 
    b  2  1   0  0 
      4  5   .25 4 
      8  1   0  1 

所以Name1索引不重複數據,但Name2索引確實(我正在使用它來跟蹤二元組,所以Name1 & Name2一起只表示一次)。我現在想要添加的是與Name2數據對應的4列數據(有關第二個成員的信息)。與「當前」「r」和「行爲」數據不同,這些數據是每個人的數據,而不是每對數據。所以在合併時我不需要考慮Name1數據。

的問題是,雖然重複名稱2數據被用盡的對子連擊,在數據中的「NAME2」列現在我想只添加具有一個片每名稱2個人的數據:

Name2 Data1 Data2 Data3 
    1  80  6  1 
    2  61  8  3 
    4  45  7  2 
    8  30  3  6 

我想什麼輸出看起來像:

Name1 Name2 present r  behavior Data1 Data2 Data3 
    a  1  1   0  0   80  6  1 
      2  1   .5  2   61  8  3 
      4  3   .125 1   45  7  2 
    b  2  1   0  0   61  8  3 
      4  5   .25 4   45  7  2 
      8  1   0  1   30  3  6 

儘管閱讀文檔,我不是我是否可以使用join()方法或合併()爲期望的結果清晰。如果我嘗試對現有數據框進行連接,就像之前使用的簡單連接一樣,那麼我最終會得到新的列,但它們充滿了NaN值。我也嘗試過使用Name1和Name2作爲列或索引的各種組合,可以使用連接或合併(不像聽起來那樣隨意,但我顯然不能正確解釋文檔!)。非常感謝您的幫助,因爲我目前非常失落。

回答

1

我不確定這是否是最好的方法,但是您可以使用reset_index暫時將您的原始DataFrame索引爲Name2。然後像往常一樣執行join。然後使用​​再次進行多指標的Name1部分:

import pandas as pd 

df = pd.DataFrame({'Name1':['a','a','a','b','b','b'], 
        'Name2':[1,2,4,2,4,8], 
        'present':[1,1,3,1,5,1]}) 
df.set_index(['Name1','Name2'], inplace=True) 

df2 = pd.DataFrame({'Data1':[80,61,45,30], 
        'Data2':[6,8,7,3]}, 
        index=pd.Series([1,2,4,8], name='Name2')) 
result = df.reset_index(level=0).join(df2).set_index('Name1', append=True) 
print(result) 
#    present Data1 Data2 
# Name2 Name1      
# 1  a   1  80  6 
# 2  a   1  61  8 
#  b   1  61  8 
# 4  a   3  45  7 
#  b   5  45  7 
# 8  b   1  30  3 

爲了使結果看起來更加像你期望的數據框,你可以重新排列和排序的指標:

print(result.reorder_levels([1,0],axis=0).sort(axis=0)) 
#    present Data1 Data2 
# Name1 Name2      
# a  1   1  80  6 
#  2   1  61  8 
#  4   3  45  7 
# b  2   1  61  8 
#  4   5  45  7 
#  8   1  30  3 
+0

這工作 - 我必須一直在設置錯誤的參數,因爲這是我嘗試的方法之一。很高興知道我不是在完全錯誤的方向上游蕩。) –