使用字典映射填充DataFrame缺失列时返回NaN的问题求助
解决DataFrame用字典映射填充缺失值返回NaN的问题
我来帮你搞定这个问题!先明确一下你的场景:
你有一个存在缺失值的DataFrame:
import pandas as pd data = { 'City': ['Chicago', 'Boston', 'San Diego', 'Los Angeles', 'San Francisco', 'Sacramento', 'Vancouver', 'Toronto'], 'State': ['IL', None, 'CA', 'CA', None, None, 'BC', None], 'Country': ['United States', None, 'United States', 'United States', None, None, 'Canada', None] } df = pd.DataFrame(data)
同时你有三个对应缺失城市的补全列表:
city_list = ['Boston', 'San Francisco', 'Sacramento', 'Toronto'] state_list = ['MA', 'CA', 'CA', 'ON'] country_list = ['United States', 'United States', 'United States', 'Canada']
你尝试用字典映射填充,但结果返回NaN,核心问题是你没有把City作为匹配的主键来关联对应的补全数据——直接按列映射的话,程序根本不知道哪个缺失值对应哪个城市的State/Country。
下面给你两种可行的解决方法:
方法1:构造城市-补全信息映射字典,逐行填充
首先把三个列表整合成一个以城市为键,包含对应State和Country的字典,这样就能精准匹配:
# 构造映射字典,键是城市,值是包含State和Country的子字典 city_mapping = { city: {'State': state, 'Country': country} for city, state, country in zip(city_list, state_list, country_list) }
然后用apply遍历每一行,发现缺失值时就从字典里取对应数据填充:
def fill_missing_values(row): # 当State或Country为空,且当前城市在映射字典中时填充 if pd.isna(row['State']) or pd.isna(row['Country']): if row['City'] in city_mapping: row['State'] = city_mapping[row['City']]['State'] row['Country'] = city_mapping[row['City']]['Country'] return row # 应用函数完成填充 filled_df = df.apply(fill_missing_values, axis=1)
方法2:更高效的map+fillna组合(适合大数据量)
如果你的DataFrame数据量很大,逐行遍历效率较低,可以分别为State和Country构造单独的映射字典,用map结合fillna快速填充:
# 分别构造城市到State、城市到Country的映射 state_map = dict(zip(city_list, state_list)) country_map = dict(zip(city_list, country_list)) # 填充State和Country的缺失值 df['State'] = df['State'].fillna(df['City'].map(state_map)) df['Country'] = df['Country'].fillna(df['City'].map(country_map))
最终填充后的结果
执行完上面任意一种方法后,你的DataFrame会变成完整的样子:
City State Country 0 Chicago IL United States 1 Boston MA United States 2 San Diego CA United States 3 Los Angeles CA United States 4 San Francisco CA United States 5 Sacramento CA United States 6 Vancouver BC Canada 7 Toronto ON Canada
再回头说为什么之前会返回NaN:通常是因为你构造字典的方式不对(比如没有以City为键),或者填充时没有通过City列去关联补全数据,导致程序找不到匹配项,所以返回NaN。比如如果你直接用df['State'] = df['State'].replace(state_list),这种操作完全没有关联城市,自然匹配不上。
内容的提问来源于stack exchange,提问作者Karma
相关产品推荐
相关产品推荐

