2013-03-05 48 views
2

我的問題是我有一個大型的數據框(約300,000行),每個主題代表不同的條件下的給定值。簡化版本如下所示:使用來自單獨DataFrame的編碼數據向Pandas DataFrame添加新列而不使用循環?

In [12]: df1 
Out[12]: 
    SubID Condition Value 
0  1   1 0.123 
1  1   2 0.234 
2  2   1 0.345 
3  2   2 0.456 
4  3   1 0.567 
5  3   2 0.678 
6  4   1 0.789 

我也有第二張表,只有80奇數行持有該主題所屬的遺傳組。

我想這些數據添加到數據幀首。編碼表的簡化版本如下所示:

In [17]: df2 
Out[17]: 
    Subject Number Genetic Group 
0    1    A 
1    2    C 
2    3    A 
3    4    B 

我想直到結束是:

In [19]: df1 
Out[19]: 
    SubID Condition Value Genetic Group 
0  1   1 0.123    A 
1  1   2 0.234    A 
2  2   1 0.345    C 
3  2   2 0.456    C 
4  3   1 0.567    A 
5  3   2 0.678    A 
6  4   1 0.789    B 

我可以使用的:循環,但使用任何想知道是否有一個方法大熊貓DataFrame的合併或加入操作會避免這種情況?非常感謝,

回答

2

您可以通過子ID,然後使用join指數得到你想要的東西:

df1.set_index("SubID", inplace=True) 
df2.set_index("Subject Number", inplace=True) 
df3 = df1.join(df2, how="left") 

或者,你可以使用merge實現無索引:

df3 = df1.merge(df2, left_on="SubID", right_on="Subject Number", how="left") 
1

另一種方式是:

In [1]: import pandas as pd 

In [2]: a = pd.DataFrame({"SubID":[1,1,2,2], "Condition":[1,2,1,2], "Value":[.123,.234,.345,.456]}) 

In [3]: a 
Out[3]: 
    Condition SubID Value 
0   1  1 0.123 
1   2  1 0.234 
2   1  2 0.345 
3   2  2 0.456 

In [4]: a = a.set_index(["SubID","Condition"]).unstack() 

In [5]: b = pd.DataFrame({"Subject Number":[1,2], "Genetic Group":['A','C']}) 

In [6]: b 
Out[6]: 
    Genetic Group Subject Number 
0    A    1 
1    C    2 

In [7]: b["Condition"] = "Genetic Group" 

In [8]: b = b.rename(columns={"Genetic Group":"Value"}) 

In [9]: b = b.set_index(["Subject Number","Condition"]).unstack() 

In [10]: b 
Out[10]: 
         Value 
Condition  Genetic Group 
Subject Number    
1       A 
2       C 

In [11]: r = a.merge(b, left_index=True, right_index=True) 

In [12]: r 
Out[12]: 
      Value    Value 
Condition  1  2 Genetic Group 
SubID         
1   0.123 0.234    A 
2   0.345 0.456    C 

In [13]: r = r.unstack() 

In [14]: r = r.swaplevel(0,2).sort_index() 

In [15]: r 
Out[15]: 
SubID Condition   
1  1    Value 0.123 
     2    Value 0.234 
     Genetic Group Value  A 
2  1    Value 0.345 
     2    Value 0.456 
     Genetic Group Value  C 
+0

謝謝馬克西姆。今天我又看了一下你的回覆(現在我又在我的電腦前),這很有道理。我認爲這可能對我稍後需要做的其他操作有用,所以感謝您花時間回覆。 – 2013-03-06 09:48:55

+0

@PhilipLawrence我應該補充更多的意見,但沒有足夠的時間。基本上,你的數據是_narrow_格式。我首先將其轉換爲_long_格式,其中每個值類型都有自己的列,然後再添加另一列,然後將其轉換回_narrow_格式。 – 2013-03-06 12:23:16

相關問題