在Pandas中使用Apply Lambda函数具有多个if语句
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Pandas中使用Apply Lambda函数具有多个if语句相关的知识,希望对你有一定的参考价值。
我试图根据像这样的数据框中的人的大小来推断分类:
Size
1 80000
2 8000000
3 8000000000
...
我希望它看起来像这样:
Size Classification
1 80000 <1m
2 8000000 1-10m
3 8000000000 >1bi
...
我理解理想的过程是应用这样的lambda函数:
df['Classification']=df['Size'].apply(lambda x: "<1m" if x<1000000 else "1-10m" if 1000000<x<10000000 else ...)
我检查了一些关于lambda函数here is an example link中的多个ifs的帖子,但是这个synthax在多个ifs语句中由于某种原因不适合我,但是它在单个if条件下工作。
所以我尝试了这个“非常优雅”的解决方案:
df['Classification']=df['Size'].apply(lambda x: "<1m" if x<1000000 else pass)
df['Classification']=df['Size'].apply(lambda x: "1-10m" if 1000000 < x < 10000000 else pass)
df['Classification']=df['Size'].apply(lambda x: "10-50m" if 10000000 < x < 50000000 else pass)
df['Classification']=df['Size'].apply(lambda x: "50-100m" if 50000000 < x < 100000000 else pass)
df['Classification']=df['Size'].apply(lambda x: "100-500m" if 100000000 < x < 500000000 else pass)
df['Classification']=df['Size'].apply(lambda x: "500m-1bi" if 500000000 < x < 1000000000 else pass)
df['Classification']=df['Size'].apply(lambda x: ">1bi" if 1000000000 < x else pass)
可以看出“pass”似乎也不适用于lambda函数:
df['Classification']=df['Size'].apply(lambda x: "<1m" if x<1000000 else pass)
SyntaxError: invalid syntax
关于Pandas中apply方法中lambda函数内多个if语句的正确语法的任何建议?多线或单线解决方案对我有用。
这是一个可以构建的小例子:
基本上,lambda x: x..
是一个函数的短单线。真正需要的是一个你可以轻松重建的功能。
import pandas as pd
# Recreate the dataframe
data = dict(Size=[80000,8000000,800000000])
df = pd.DataFrame(data)
# Create a function that returns desired values
# You only need to check upper bound as the next elif-statement will catch the value
def func(x):
if x < 1e6:
return "<1m"
elif x < 1e7:
return "1-10m"
elif x < 5e7:
return "10-50m"
else:
return 'N/A'
# Add elif statements....
df['Classification'] = df['Size'].apply(func)
print(df)
返回:
Size Classification
0 80000 <1m
1 8000000 1-10m
2 800000000 N/A
你可以使用pd.cut
function:
bins = [0, 1000000, 10000000, 50000000, ...]
labels = ['<1m','1-10m','10-50m', ...]
df['Classification'] = pd.cut(df['Size'], bins=bins, labels=labels)
使用Numpy的searchsorted
labels = np.array(['<1m', '1-10m', '10-50m', '>50m'])
bins = np.array([1E6, 1E7, 5E7])
# Using assign is my preference as it produces a copy of df with new column
df.assign(Classification=labels[bins.searchsorted(df['Size'].values)])
如果要在现有数据框中生成新列
df['Classification'] = labels[bins.searchsorted(df['Size'].values)]
一些解释
查找应插入元素以维护顺序的索引。
将索引查找到排序数组a中,如果在索引之前插入v中的相应元素,则将保留a的顺序。
labels
数组的长度大于bins
的长度。因为当某些东西大于bins
中的最大值时,searchsorted
会返回一个-1
。当我们切割labels
时,这抓住了最后一个标签。
以上是关于在Pandas中使用Apply Lambda函数具有多个if语句的主要内容,如果未能解决你的问题,请参考以下文章
pandas中groupby,apply,lambda函数使用
pandas新字段(数据列)生成使用np.where或者apply lambda函数结合if else生成新的字段,详解及实战