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)