2017-04-04 243 views
1

我有兩種類型dataframes的:如何創建與百分比大熊貓據幀一列,更

數據幀AID

AID FID ANumOfF 
1 X 1 
1 Y 5 
2 Z 6 
2 A 1 
2 X 11 
2 B 18 

數據幀VID

VID FID VNumOfF 
1A X 10 
1A A 500 
2A A 62 
2A B 10 
2A C 30 
2A X 23 

1 - 我希望在每個Dataframe中創建一個新列,以計算每個FID爲每個VID保留的%。因此,對於上面的例子中,結果將是以下幾點:

新的數據幀AID

AID FID ANumOfF PercentF 
1 X 1  0.167 (1/6) 
1 Y 5  0.833 (5/6) 
2 Z 6  0.167 (6/36) 
2 A 1  0.028 
2 X 11  0.305 
2 B 18  0.5 

新的數據幀VID

VID FID VNumOfF PercentF 
1A X 10  0.02 
1A A 500  0.98 
2A A 62  0.50 
2A B 10  0.08 
2A C 30  0.24 
2A X 23  0.18 

截至目前我知道下面的代碼給我每個AID/VID的總和:

AID.groupby('AID')['ANumFS'].sum() 
VID.groupby('VID')['VNumFS'].sum() 

2-在此之後,我想創建一個新的數據幀,查看存在的每對VID和AID的「重疊」。它會總結他們都會分享的百分比。因此,對於上述製造的新dataframes,我們會得到如下:

由於AID=1VID=1A唯一的共同點FID=X,重疊計算爲:0.167*0.02 = 0.00334

AID=2VID=2A有共同FIDs A, B and X,所以重疊的計算會是:0.028*0.5 + 0.305*0.18 + 0.5*0.08 = 0.1089

AID VID Overlap 
1  1A 0.00334 
1  2A 0.03006 
2  1A 0.03354 
2  2A 0.1089 

我該如何做到這一點?

+0

到目前爲止你的代碼是什麼? – Felix

回答

1

我認爲你可以使用divtransform創建新列:

AID['PercentF'] = AID['ANumOfF'].div(AID.groupby('AID')['ANumOfF'].transform('sum')) 
print (AID) 
    AID FID ANumOfF PercentF 
0 1 X  1 0.166667 
1 1 Y  5 0.833333 
2 2 Z  6 0.166667 
3 2 A  1 0.027778 
4 2 X  11 0.305556 
5 2 B  18 0.500000 

VID['PercentF'] = VID['ANumOfF'].div(VID.groupby('VID')['ANumOfF'].transform('sum')) 
print (VID) 
    VID FID ANumOfF PercentF 
0 1A X  10 0.019608 
1 1A A  500 0.980392 
2 2A A  62 0.496000 
3 2A B  10 0.080000 
4 2A C  30 0.240000 
5 2A X  23 0.184000 

然後inner通過merge,多列和最後groupby與聚集sum加入:

df = pd.merge(AID, VID, on='FID') 
df['Overlap'] = df.PercentF_x.mul(df.PercentF_y) 
df = df.groupby(['AID','VID'], as_index=False)['Overlap'].sum() 
print (df) 
    AID VID Overlap 
0 1 1A 0.003268 
1 1 2A 0.030667 
2 2 1A 0.033224 
3 2 2A 0.110000 
1

可以先使用groupby得到這樣的表格:

AID Sum(ANumOfF) 
1 6 
2 36 

然後join該數據框與原來的:

AID FID ANumOfF TotalNum 
1 X 1  6 
1 Y 5  6 
2 Z 6  36 
2 A 1  36 
2 X 11  36 
2 B 18  36 

然後終於由TotalNum列除以ANumOfF列得到的百分比。

希望這會有所幫助。