python - 如何通过将一个数据帧与另一个数据帧进行比较来填充一个数据帧中的列
问题描述
我有一个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
s in 。我想使用一个等式填充该行的值: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
列?
解决方案
我认为你需要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
推荐阅读
- outlook - 如何让我的 iOS 应用程序使用带有 safelinks.protection.outlook.com 的通用链接
- react-router-dom - 如何使用 react-router-dom 保存表单数据?
- node.js - 为什么 11ty 将所有内容编译到输出目录 *except* index.njk?
- api - 通过 API Token 创建会话设置过期 cookie
- python - object.__getattribute__ 如何重定向到我的描述符和 __getattr__ 上的 __get__ 方法?
- ios - '不能在不可变值上使用变异getter:'self'是不可变的'迭代时?
- sql - 在访问数据库中存储信息
- ansible - YAML 列表过滤
- excel - 无法使用 VBA 将日期粘贴到 chrome - Selenium
- python - Python - pandas.DataFrame.append 遇到问题