熊猫赋值基于另一列



我的数据帧

Terrain     
M1
M2
F
G
S
B1
B2

我想打开另一列Terrain_Type并指定值,例如,如果Terrain是M1、M2、B1、B2作为Terrain_TType中的Composite,Terrain中的S作为Terrain_Type中的Sod,而不是F和G,我想在Terrain Type列中指定Gravel。

我已经尝试过这个代码

data['Terrain_Type'] = data['Terrain'].map({['M1','M2','B1','B2']:'Composite', 'S':'Sod',['F','G']:'Gravel'})

但是没有成功。有人能建议我如何解决我的代码中的这个错误吗

您需要使用有效的字典进行映射,而在现有的字典中,您使用列表作为键,这可能会有问题。假设字典是这样的:

import pandas as pd                                                                               
data = pd.DataFrame({'Terrain':['M1','M2','F','G','S','B1','B2']}) 
d = {'Composite':['M1','M2','B1','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
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

我相信以下内容将适用于您:(

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))

最新更新