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

新手上路,请多包涵

我正在尝试根据数据框中的人的大小来推断分类,如下所示:

       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 函数中的多个 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)

计算出“通过”似乎也不适用于 lambda 函数:

 df['Classification']=df['Size'].apply(lambda x: "<1m" if x<1000000 else pass)
SyntaxError: invalid syntax

关于 Pandas 中 apply 方法中 lambda 函数内多个 if 语句的正确语法的任何建议?多线或单线解决方案都适合我。

原文由 aabujamra 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 640
2 个回答

这是您可以构建的一个小示例:

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

 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

原文由 Anton vBR 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 pd.cut 功能

 bins = [0, 1000000, 10000000, 50000000, ...]
labels = ['<1m','1-10m','10-50m', ...]

df['Classification'] = pd.cut(df['Size'], bins=bins, labels=labels)

原文由 MaxU - stop russian terror 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏