基于变量值的新python dataframe列,使用函数
我有一个变量,基于变量值的新python dataframe列,使用函数,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个变量,ImageName,范围为0-1600。我想根据“ImageName”的值创建一个新变量“LocationCode” 如果“ImageName”小于70,我希望“LocationCode”为1。如果“ImageName”介于71和90之间,我希望“LocationCode”为2。我一共有13种不同的代码。我不知道如何用python写这个。以下是我尝试过的: def spatLoc(ImageName): if ImageName <=70: Locat
ImageName
,范围为0-1600。我想根据“ImageName
”的值创建一个新变量“LocationCode
”
如果“ImageName
”小于70,我希望“LocationCode
”为1。如果“ImageName
”介于71和90之间,我希望“LocationCode
”为2。我一共有13种不同的代码。我不知道如何用python写这个。以下是我尝试过的:
def spatLoc(ImageName):
if ImageName <=70:
LocationCode = 1
elif ImageName >70 and ImageName <=90:
LocationCode = 2
return LocationCode
df['test'] = df.apply(spatLoc(df['ImageName'])
def spatLoc(图像名称):
如果ImageName 70和ImageName可以只使用2个布尔掩码:
df.loc[df['ImageName'] <= 70, 'Test'] = 1
df.loc[(df['ImageName'] > 70) & (df['ImageName'] <= 90), 'Test'] = 2
在这里,bin值是使用范围生成的,但是您可以自己传递bin值列表,一旦获得了bin值,您就可以定义查找dict:
In [32]:
d = dict(zip(df['group'].unique(), range(len(df['group'].unique()))))
d
Out[32]:
{'[0, 10)': 2,
'[10, 20)': 4,
'[20, 30)': 9,
'[30, 40)': 7,
'[40, 50)': 0,
'[50, 60)': 5,
'[60, 70)': 8,
'[70, 80)': 1,
'[80, 90)': 3,
'[90, 100)': 6}
您现在可以调用并添加新列:
In [33]:
df['test'] = df['group'].map(d)
df
Out[33]:
ImageName group test
0 48 [40, 50) 0
1 78 [70, 80) 1
2 5 [0, 10) 2
3 4 [0, 10) 2
4 9 [0, 10) 2
5 81 [80, 90) 3
6 49 [40, 50) 0
7 11 [10, 20) 4
8 57 [50, 60) 5
9 17 [10, 20) 4
10 92 [90, 100) 6
11 30 [30, 40) 7
12 74 [70, 80) 1
13 62 [60, 70) 8
14 83 [80, 90) 3
15 21 [20, 30) 9
16 97 [90, 100) 6
17 11 [10, 20) 4
18 34 [30, 40) 7
19 78 [70, 80) 1
上面的内容可以根据您的需要进行修改,但这只是为了演示一种快速且无需迭代df的方法。在Python中,您可以使用字典查找符号来查找行中的字段。字段名为ImageName
。在下面的spatLoc()
函数中,参数行是一个包含整行的字典,您可以使用字段名作为字典的键来查找单个列
def spatLoc(row):
if row['ImageName'] <=70:
LocationCode = 1
elif row['ImageName'] >70 and row['ImageName'] <=90:
LocationCode = 2
return LocationCode
df['test'] = df.apply(spatLoc, axis=1)
def spatLoc(世界其他地区):
如果行['ImageName']70和行['ImageName']-->返回位置代码也应该缩进。看起来它已经从你的方法定义中消失了真的!这是一个复制/粘贴问题,对不起。我已经更新了我的答案,以显示一种不使用13个遮罩的方式,它稍微复杂一些,但我认为它更干净。请描述,您更改了什么以及为什么,以帮助其他人理解问题和此答案
def spatLoc(row):
if row['ImageName'] <=70:
LocationCode = 1
elif row['ImageName'] >70 and row['ImageName'] <=90:
LocationCode = 2
return LocationCode
df['test'] = df.apply(spatLoc, axis=1)