我想做这样的事情:
for row in df:
if row['Country'] == 'unknown':
row['Country'] = city2country_mapping[row['city']]
国家和城市是列。
“ city2country_mapping”是字典,其中“键:值”对是“ city”:“ country”。
(基本上,我试图通过从字典中获取国家/地区来填充未知数,因为我知道每一行的城市)
答案 0 :(得分:1)
您可以使用pandas.Series.where
将其向量化:
df['country'] = df.country.where(
df.country != 'unknown', df.city.map(city2country_mapping))
df.city.map(city2country_mapping)
将首先创建一个包含每个城市相应国家/地区的系列,然后使用它替换unknown
列中的country
个国家/地区。
答案 1 :(得分:1)
您可以使用apply
进行此操作:
df['Country'] = df.apply(lambda row: city2country_mapping[row['city']]
if row['Country'] == 'unknown' else row['Country'], axis=1)
对于“未知”国家/地区,Lambda从映射中返回城市,否则仅返回该行中的国家/地区。
答案 2 :(得分:1)
编辑特定行:DataFrame.loc
与Series.where
用于编辑DataFrame
对象的特定行(“切片”)的标准选项是.loc
。
被接受的答案使用整洁的pandas.Series.where
应用程序来重写df.Country
系列,对于此特定任务而言,它更为简洁。
重新编码值:.apply
与.map
您可以使用.map()
直接用字典重新编码系列-无需.apply()
lambda函数。
示例
# Example data
df = pd.DataFrame({'Country': ['unknown', 'USA', 'unknown', 'UK', 'USA', 'unknown'],
'City': ['London', 'New York', 'New York', 'London', 'New York', 'Paris']
})
city2country_mapping = {'London': 'UK', 'New York': 'USA', 'Paris': 'France'}
# print(df)
# Country City
# 0 unknown London
# 1 USA New York
# 2 unknown New York
# 3 UK London
# 4 USA New York
# 5 unknown Paris
df.loc[df.Country == 'unknown', 'Country'] = df[df.Country == 'unknown'].City.map(city2country_mapping)
print(df)
输出:
Country City
0 UK London
1 USA New York
2 USA New York
3 UK London
4 USA New York
5 France Paris