新的python pandas dataframe列基于变量的值,使用函数

2024-10-03 02:42:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个变量,“ImageName”,它的范围是0-1600。我想根据“ImageName”的值创建一个新变量,“LocationCode”。在

如果“ImageName”小于70,我希望“LocationCode”为1。如果'ImageName'在71到90之间,我希望'LocationCode'为2。我一共有13个不同的密码。我不知道怎么用python pandas写这个。我试过了:

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

但它返回了一个错误。我显然没有用正确的方式来定义事物,但我不知道如何去定义。在


Tags: andtest密码pandasdfreturnif定义
2条回答

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

您只需使用2个布尔掩码:

df.loc[df['ImageName'] <= 70, 'Test'] = 1
df.loc[(df['ImageName'] > 70) & (df['ImageName'] <= 90), 'Test'] = 2

通过使用掩码,您只需设置满足布尔条件的值,对于第二个掩码,您需要使用&运算符来and条件,并根据运算符的优先级将条件括在括号中

实际上,我认为最好定义bin值并调用^{},例如:

^{pr2}$

这里的bin值是使用range生成的,但是您可以自己传递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。在

相关问题 更多 >