如何在dataframe中使用百分比和m创建列

2024-06-27 18:44:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两种类型的数据帧:

数据帧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=2AFIDs 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

我怎样才能做到这一点


Tags: 数据代码示例类型百分比sumgroupbyvid
2条回答

我认为可以使用^{}^{}来创建新列:

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通过^{}、多个列和最后一个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

然后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

最后用ANumOfF列除以TotalNum列得到百分比

希望这有帮助

相关问题 更多 >