首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在具有多个if语句的Pandas函数中使用Apply

在具有多个if语句的Pandas函数中使用Apply
EN

Stack Overflow用户
提问于 2018-02-19 18:34:11
回答 4查看 52.9K关注 0票数 17

我试图根据像这样的数据仓库中的人的大小来推断出一个分类:

代码语言:javascript
复制
      Size
1     80000
2     8000000
3     8000000000
...

我想让它看起来像这样

代码语言:javascript
复制
      Size        Classification
1     80000       <1m
2     8000000     1-10m
3     8000000000  >1bi
...

我知道,理想的过程是应用lambda函数,如下所示:

代码语言:javascript
复制
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的帖子,但是在多个ifs语句中,由于某种原因,synthax不适合我,但是它只在一个if条件下工作。

因此,我尝试了这个“非常优雅”的解决方案:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
df['Classification']=df['Size'].apply(lambda x: "<1m" if x<1000000 else pass)
SyntaxError: invalid syntax

对于Pandas中应用方法中lambda函数中的多个if语句,有关于正确的synthax的建议吗?无论是多行还是单行解决方案都适用于我。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-19 18:37:24

下面是一个小示例,您可以在此基础上构建:

基本上,lambda x: x..是函数的短一行.应用真正要求的是一个功能,您可以轻松地重新创建自己。

代码语言:javascript
复制
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)

返回:

代码语言:javascript
复制
        Size Classification
0      80000            <1m
1    8000000          1-10m
2  800000000            N/A
票数 21
EN

Stack Overflow用户

发布于 2018-02-19 18:40:33

您可以使用 function

代码语言:javascript
复制
bins = [0, 1000000, 10000000, 50000000, ...]
labels = ['<1m','1-10m','10-50m', ...]

df['Classification'] = pd.cut(df['Size'], bins=bins, labels=labels)
票数 7
EN

Stack Overflow用户

发布于 2020-06-10 14:34:19

应用lambda函数实际上是在这里工作,我只是想知道问题是什么.因为你的语法看起来很好,而且很有效.

代码语言:javascript
复制
df1= [80000, 8000000, 8000000000, 800000000000]
df=pd.DataFrame(df1)
df.columns=['size']
df['Classification']=df['size'].apply(lambda x: '<1m' if x<1000000  else '1-10m' if 1000000<x<10000000 else '1bi')
df

输出:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48872234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档