Как заполнить столбец в одном кадре данных, сравнивая его с другим кадром данных - PullRequest
0 голосов
/ 25 июня 2019

У меня есть dataframe под названием res_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, а затем суммируется с использованием агрегации, чтобы получить sum столбца Bldg_Sq_Ft и mean столбца CensusPop для каждого уникального GEOID. Давайте назовем это geoid_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

Моя цель - найти GEOID в res_df, которые соответствуют GEOID в geoid_sum. Я хочу заполнить значение в Pop_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?

1 Ответ

1 голос
/ 25 июня 2019

Я думаю, вам нужно 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...