我有两个数据帧:df_geo
和df_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
获取county
和state
输入,并在同一数据帧中创建两个新列。 新列基于df_geo
中的state_fips
和county_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_fips
是17,与伊利诺伊州和该州本身的所有其他县相同。 阿拉巴马州圣克莱尔的state_fips
是01,与阿拉巴马州的所有其他县相同,依此类推......
我想使用相同的搜索和地图功能一直到city_code_fips
。 在这个级别上,任何搜索词都必须完全相同,以避免在我打算找到"伯特利镇"时选择"伯特利镇"。 确切的输入也很重要,因为一些州,如路易斯安那州,用另一个名称来称呼他们的县级地理。
在df_event
中,"_"表示该县未知。
df_event['event_id']
是唯一的字符串。 数据帧中的行几乎相同,但 ID 不同,指示事件已多次发生。 这没有影响。state_fips
或county_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