我有一个数据帧df
,其中包含分配给一些建筑物b
的population p
df
p b
0 150 3
1 345 7
2 177 4
3 267 2
和一个数据帧df1
,它将一些其他建筑物b1
关联到df
中的建筑物
df1
b1 b
0 17 3
1 9 7
2 13 7
我想给在df1
中有关联的建筑物分配一个除以建筑物数量的人口。通过这种方式,我们生成了df2
,它将种群150/2=75
分配给建筑物3
和17
,并将种群345/3=115
分配给建筑物7,9,13
。
df2
p b
0 75 3
1 75 17
2 115 7
3 115 9
4 115 13
5 177 4
6 267 2
发布于 2019-09-03 00:17:54
IIUC,您可以尝试合并b
上的两个dfs,然后是stack()
和一些清理,最后在p
上分组并转换count
,然后将p
除以,以得到p
上的除值。
m=(df.merge(df1,on='b',how='left').set_index('p').stack().reset_index(name='b')
.drop_duplicates().drop('level_1',1).sort_values('p'))
m.p=m.p/m.groupby('p')['p'].transform('count')
print(m.sort_index())
p b
0 75.0 3.0
1 75.0 17.0
2 115.0 7.0
3 115.0 9.0
5 115.0 13.0
6 177.0 4.0
7 267.0 2.0
发布于 2019-09-03 02:59:21
使用pd.concat
的另一种方式。之后,分别对b1
和p
执行fillna
。接下来,使用mean
进行transform
,并将已填充的b1
分配给最终数据帧
df2 = pd.concat([df, df1], sort=True).sort_values('b')
df2['b1'] = df2.b1.fillna(df2.b)
df2['p'] = df2.p.fillna(0)
df2.groupby('b').p.transform('mean').to_frame().assign(b=df2.b1).reset_index(drop=True)
Out[159]:
p b
0 267.0 2.0
1 75.0 3.0
2 75.0 17.0
3 177.0 4.0
4 115.0 7.0
5 115.0 9.0
6 115.0 13.0
https://stackoverflow.com/questions/57759568
复制相似问题