2017-04-04 109 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列得到的百分比。

希望这会有所帮助。