基于变量值的新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)