问题描述
我的数据框
Terrain
M1
M2
F
G
S
B1
B2
我想打开另一列Terrain_Type并分配值,例如,如果Terrain_Type中的Terrain是M1,M2,B1,B2作为Composite,而Terrain_Type中的Terra是Sod,而不是F和G,我想分配Gravel地形类型列。
我尝试过这段代码
data['Terrain_Type'] = data['Terrain'].map({['M1','M2','B1','B2']:'Composite','S':'Sod',['F','G']:'Gravel'})
解决方法
L1 = ['M1','M2','B1','B2']
d1 = dict.fromkeys(L1,'Composite')
L2 = ['F','G']
d2 = dict.fromkeys(L2,'Gravel')
L3 = ['S']
d3 = dict.fromkeys(L3,'Sod')
d = {**d1,**d2,**d3}
地图:
df['Terrain_Type'] = df['Terrain'].map(d)
输出:
Terrain Terrain_Type
0 M1 Composite
1 M2 Composite
2 F Gravel
3 G Gravel
4 S Sod
5 B1 Composite
6 B2 Composite
,
您需要使用有效的词典进行映射,并且在您拥有的字典中,您正在使用列表作为键,这可能会出现问题。因此,我们假设字典是这样的:
import pandas as pd
data = pd.DataFrame({'Terrain':['M1','F','G','S','B2']})
d = {'Composite':['M1','B2'],'Sod':['S'],'Gravel':['F','G']}
我们可以创建一个与此相反的图,将地形映射到类型:
new_dic = {}
for k,v in d.items():
for x in v:
new_dic[x]=k
new_dic
{'M1': 'Composite','M2': 'Composite','B1': 'Composite','B2': 'Composite','S': 'Sod','F': 'Gravel','G': 'Gravel'}
这将起作用:
data["Terain_Type"] = data["Terrain"].map(new_dic)
data
Terrain Terain_Type
0 M1 Composite
1 M2 Composite
2 F Gravel
3 G Gravel
4 S Sod
5 B1 Composite
6 B2 Composite
,
我相信以下内容对您有用:)
def get_terrain_type(row):
if row in ["M1","M2","B1","B2"]:
return "Composite"
elif row == "S":
return "Sod"
else:
return "Gravel"
data["Terain_Type"] = data["Terrain"].map(lambda x: get_terrain_type(x))