繁体   English   中英

如何在熊猫数据框中创建带有百分比等的列

[英]How to create a column in pandas dataframe with percentages, and more

我有两种类型的数据框:

数据框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-我想在每个数据框中创建一个新列,以计算每个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的“重叠”。 并将它们两者所占百分比的乘积相加。 因此,对于上面产生的新数据框,我们将获得以下内容:

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

我该如何实现?

我认为您可以使用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

然后通过merge inner groupby ,多列和最后的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

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

AID Sum(ANumOfF)
1   6
2   36

然后将该DataFrame与原始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列来最终获得百分比。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM