通过搜索另一个数据帧来映射新列的值



我有两个数据帧:df_geodf_event。我想在df_event中创建两个新列。 数据框类似于以下内容,但为简单起见,已删除其他列:

data_geo =  [['040','01','000','00000','00000','00000','Alabama'],
['050','01','001','00000','00000','00000','Autauga County'],
['050','01','097','00000','00000','00000','Mobile County'],
['050','01','101','00000','00000','00000','Montgomery County'],
['050','01','115','00000','00000','00000','St. Clair County'],
['040','09','000','00000','00000','00000','Connecticut'],
['061','09','001','04720','00000','00000','Bethel town'],
['040','17','000','00000','00000','00000','Illinois'],
['061','17','109','05638','00000','00000','Bethel township'],
['050','17','163','00000','00000','00000','St. Clair County']] 
dfgeo = pd.DataFrame(data_geo, columns = ['summary_level', 'state_fips','county_fips','subdivision_code_fips','place_code_fips','city_code_fips','area_name']) 
df_geo.info()
RangeIndex: 43847 entries, 0 to 43846
Data columns (total 7 columns):
summary_level            43847 non-null object
state_fips               43847 non-null object
county_fips              43847 non-null object
subdivision_code_fips    43847 non-null object
place_code_fips          43847 non-null object
city_code_fips           43847 non-null object
area_name                43847 non-null object
data_event = [['event_id','_','Alabama'], 
['event_id','_','Connecticut'],
['event_id','Autauga County','Alabama'],
['event_id','Fairfield County','Connecticut'],
['event_id','Fairbanks North Star Borough','Alaska']] 
df_event = pd.DataFrame(data_event, columns = ['event_id','county','state']) 
df_event.info()
RangeIndex: 1261 entries, 0 to 1260
Data columns (total 3 columns):
event_id                1261 non-null object
county                   999 non-null object
state                   1261 non-null object
dtypes: object(3) 

GOAL创建一个函数,该函数可以从df_event获取countystate输入,并在同一数据帧中创建两个新列。 新列基于df_geo中的state_fipscounty_fips的值。 这方面的示例如下所示:

inputA fun('df_geo','Connecticut','Fairfield County'):   
resultA = ['event_id','Connecticut','Fairfield County','09','001']
^New columns
inputB fun('df_geo','Alaska','Fairbanks North Star Borough'):   
resultB = ['event_id','Alaska','Fairbanks North Star Borough','02','090']
^New columns

这是一个问题,因为我还需要在 1,200 个(并且还在增长(的事件列表中使用此函数,该函数必须在 lamba 函数或其他可以将其映射到整个数据帧的东西中工作。

由于在几个州出现的"圣克莱尔县"等相同的县名,情况变得复杂。 尽管它们的area_names相同,但state_fips的价值会有所不同。

伊利诺伊州圣克莱尔的state_fips17,与伊利诺伊州和该州本身的所有其他县相同。 阿拉巴马州圣克莱尔的state_fips01,与阿拉巴马州的所有其他县相同,依此类推......

我想使用相同的搜索和地图功能一直到city_code_fips。 在这个级别上,任何搜索词都必须完全相同,以避免在我打算找到"伯特利镇"时选择"伯特利镇"。 确切的输入也很重要,因为一些州,如路易斯安那州,用另一个名称来称呼他们的级地理。

df_event中,"_"表示该县未知。

df_event['event_id']是唯一的字符串。 数据帧中的行几乎相同,但 ID 不同,指示事件已多次发生。 这没有影响。state_fipscounty_fips.

我知道这是一个多步骤的过程,但感谢所有的帮助。谢谢。

您可以使用df.merge执行此操作:

In [289]: df_event['state_fips'] = df_event.merge(dfgeo[['state_fips','area_name']], left_on='state', right_on='area_name', how='left')['state_fips']    
In [290]: df_event['county_fips'] = df_event.merge(dfgeo[['county_fips','area_name']], left_on='county', right_on='area_name', how='left')['county_fips']
In [291]: df_event
Out[291]: 
unique_str                        county        state state_fips county_fips
0   Event Id                             _      Alabama         01         NaN
1   Event Id                             _  Connecticut         09         NaN
2   Event Id                Autauga County      Alabama         01         001
3   Event Id              Fairfield County  Connecticut         09         001
4   Event Id  Fairbanks North Star Borough       Alaska         02         090
如果存在重复项area_name

列首先通过DataFrame.drop_duplicates删除它们:

dfgeo = dfgeo.drop_duplicates('area_name')

然后Series.map,什么像merge这样更快,所以应该更可取:

df_event['state_fips'] = df_event['state'].map(dfgeo.set_index('area_name')['state_fips'])
df_event['county_fips'] = df_event['county'].map(dfgeo.set_index('area_name')['county_fips'])
print (df_event)
unique_str                        county        state state_fips county_fips
0   Event Id                             _      Alabama         01         NaN
1   Event Id                             _  Connecticut         09         NaN
2   Event Id                Autauga County      Alabama         01         001
3   Event Id              Fairfield County  Connecticut         09         001
4   Event Id  Fairbanks North Star Borough       Alaska         02         090

最新更新