如何使用百分比等在pandas数据框架中创建列

时间:2017-04-04 11:12:27

标签: python pandas dataframe

我有两种类型的数据框:

数据框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中创建一个新列,用于计算每个VID保存的每个FID的%。因此,例如以上结果如下:

新数据框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。并且它将总结他们将共享的百分比的乘积。因此,对于上面生成的新数据帧,我们将获得以下内容:

由于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

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分: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 :(得分:1)

好的,首先使用groupby来获得这样的表:

AID Sum(ANumOfF)
1   6
2   36

然后join表示DataFrame与原始文件:

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

最后通过将ANumOfF列除以TotalNum列来获得百分比。

希望这有帮助。