Python 使用字典为一系列值设置键

Python 使用字典为一系列值设置键,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一个熊猫数据框,我想根据另一列的值在一个新列中创建类别。我可以通过这样做来解决我的基本问题: range = { range(0, 5) : 'Below 5', range(6,10): 'between', range(11, 1000) : 'above' } df['range'] = df['value'].map(range) 在最后一个dictionary键中,我为range选择了一个较大的上限值,以确保它捕获我试图映射的所有值。然而,这似乎是一个丑

我有一个熊猫数据框,我想根据另一列的值在一个新列中创建类别。我可以通过这样做来解决我的基本问题:

range = {
    range(0, 5) : 'Below 5',
    range(6,10): 'between',
    range(11, 1000) : 'above'
}

df['range'] = df['value'].map(range)
在最后一个dictionary键中,我为range选择了一个较大的上限值,以确保它捕获我试图映射的所有值。然而,这似乎是一个丑陋的黑客,我想知道如何在不指定上限的情况下推广这一点。即,如果>10,‘高于’


谢谢

您可以先将所有值设置为“高于”,然后对其余选项使用
map()
(因此,您的
范围
dict只有两项):


谢谢你的提示。我认为我可以通过以下方式实现同样的目标:

df['range'] = df['value'].map(range).fillna('above')

下面是使用的另一种方法,您可以指定布尔条件列表和选项列表:

import numpy as np 

# Setup
df = pd.DataFrame({'value': [1, 3, 6, 8, 20, 10000000]})

condlist = [
    df['value'].lt(5),
    df['value'].between(5, 10),
    df['value'].gt(10)]

choicelist = ['Below 5', 'between', 'above']

df['out'] = np.select(condlist, choicelist)
print(df)
[外]


另一个想法是使用指定的
标签
参数:

df['out'] = pd.cut(df['value'], bins=[-np.inf, 5, 10, np.inf],
                   labels=['below', 'between', 'above'])

      value      out
0         1    below
1         3    below
2         6  between
3         8  between
4        20    above
5  10000000    above

假设您有这样一个数据帧:

  range value
0   0     0
1   1     1
2   2     2
3   3     3
4   4     4
5   5     5
6   6     6
7   7     7
8   8     8
9   9     9
然后可以将以下函数应用于“value”列:

def get_value(range):
    if range < 5:
        return 'Below 5'
    elif range < 10:
        return 'Between 5 and 10'
    else:
        return 'Above 10'

df['value'] = df.apply(lambda col: get_value(col['range']), axis=1)
def get_值(范围):
如果范围小于5:
返回“低于5”
elif范围<10:
返回“介于5和10之间”
其他:
返回“高于10”
df['value']=df.apply(lambda col:get_value(col['range']),轴=1)
以获得所需的结果。

也接受
函数
作为第一个参数,因此您可以执行以下操作:

def fun(x):
    if x in range(0, 5):
        return 'Below 5'
    elif x in range(6, 10):
        return 'between'
    elif x >= 11:
        return 'above'
然后:


考虑使用
apply
yes!我要试一试!这回答了你的问题吗?另外,还要注意的是,设置一个相当任意的上限(可以使用
max(df['value'])
当然。哦,很好。现在用一个带有嵌套三元比较的lambda函数替换
run
,将所有内容都设置为一行。我猜
df['range']=df['value'])。映射(lambda x:'低于5',如果在x范围内(0,5),其他('between'如果x在(范围(6,10)内,或者'over'))
可以做到这一点。@0:0对于我来说,如果
s不太可读,则嵌套一行
。如果在这种情况下我愿意以任何价格放入一行,那么我宁愿这样做:
f=lambda x:('belower 5','between','over上方')[(x>=5)+(x>=11)]
也不错。我肯定是在使用模糊的Python一行程序。幸运的是,在Python中,
True+True==2
  range value
0   0     0
1   1     1
2   2     2
3   3     3
4   4     4
5   5     5
6   6     6
7   7     7
8   8     8
9   9     9
def get_value(range):
    if range < 5:
        return 'Below 5'
    elif range < 10:
        return 'Between 5 and 10'
    else:
        return 'Above 10'

df['value'] = df.apply(lambda col: get_value(col['range']), axis=1)
def fun(x):
    if x in range(0, 5):
        return 'Below 5'
    elif x in range(6, 10):
        return 'between'
    elif x >= 11:
        return 'above'
df['range'] = df['value'].map(fun)