Python:如何合并和分割两个数据框?

时间:2019-09-02 15:32:58

标签: python pandas merge

我有一个数据框df,其中包含分配给某些建筑物p的人口b

df
    p    b
0  150   3
1  345   7
2  177   4
3  267   2

和将其他一些建筑物df1b1中建筑物关联的数据框df

df1
    b1    b
0   17    3
1   9     7
2   13    7

我想将df1中具有关联的建筑物分配给人口除以建筑物数。通过这种方式,我们生成df2,将150/2=75的人口分配给建筑物317,并将345/3=115的人口分配给建筑物{{1} }。

7,9,13

2 个答案:

答案 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分别b1p。接下来,将transformmean并向最终数据帧分配填充的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