首页 > 解决方案 > 如何通过将一个数据帧与另一个数据帧进行比较来填充一个数据帧中的列

问题描述

我有一个dataframeres_df

In [54]: res_df.head()
Out[54]:       
       Bldg_Sq_Ft        GEOID       CensusPop  HU_Pop  Pop_By_Area
0     753.026123  240010013002022       11.0     7.0          NaN
7      95.890495  240430003022003       17.0     8.0          NaN
8    1940.862793  240430003022021       86.0    33.0          NaN
24   2254.519775  245102801012021       27.0    13.0          NaN
25  11685.613281  245101503002000      152.0    74.0          NaN

我有第二个数据框,由res_df. 它按GEOID列分组,然后使用聚合进行汇总以获得每个唯一的列sumBldg_Sq_Ft和列。让我们称之为:meanCensusPopGEOIDgeoid_sum

In [55]:geoid_sum = geoid_sum.groupby('GEOID').agg({'GEOID': 'count', 'Bldg_Sq_Ft': 'sum', 'CensusPop': 'mean'})
In [56]: geoid_sum.head()
Out[56]: 
                      GEOID    Bldg_Sq_Ft  CensusPop
    GEOID                                          
    100010431001011      1   1154.915527        0.0
    100030144041044      1   5443.207520       26.0
    100050519001066      1   1164.390503        4.0
    240010001001001     15  30923.517090       41.0
    240010001001007      3   6651.656677        0.0

我的目标是找到匹配的GEOIDs in 。我想使用一个等式填充该行的值:res_dfGEOIDgeoid_sumPop_By_Area

Pop_By_Area = (geoid_sum['CensusPop'] * ref_df['Bldg_Sq_Ft'])/geoid_sum['Bldg_Sq_Ft']

我创建了一个采用这些参数的简单函数,但我不确定如何遍历数据帧并应用该函数。

def popByArea(census_pop_mean, bldg_sqft, bldg_sqft_sum):
    x = float()
    x = (census_pop_mean * bldg_sqft)/bldg_sqft_sum
    return x

我尝试根据GEOID匹配创建一个系列:s = res_df.GEOID.isin(geoid_sum.GEOID.values)但这似乎不起作用(产生了所有错误的布尔值)。如何找到匹配项并应用我的函数来填充Pop_By_Area列?

标签: pythonpandasdataframecomparepandas-groupby

解决方案


我认为你需要reindex

geoid_sum = geoid_sum.groupby('GEOID').\
              agg({'GEOID': 'count', 'Bldg_Sq_Ft': 'sum', 'CensusPop': 'mean'}).\
               reindex(res_df['GEOID'])


res_df['Pop_By_Area'] = (geoid_sum['CensusPop'].values * ref_df['Bldg_Sq_Ft'])/geoid_sum['Bldg_Sq_Ft'].values

推荐阅读