我有一个数据框df
,其中包含分配给某些建筑物p
的人口b
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
的人口分配给建筑物{{1} }。
7,9,13
答案 0 :(得分:1)
IIUC,您可以尝试合并b
上的两个df,然后合并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
答案 1 :(得分:0)
使用pd.concat
的另一种方法。之后,fillna
分别b1
和p
。接下来,将transform
与mean
并向最终数据帧分配填充的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