【问题标题】:Nested if to check if one or more pandas column satisfy a condition嵌套 if 检查一个或多个 pandas 列是否满足条件
【发布时间】:2017-08-04 08:20:06
【问题描述】:

我有一个如下所示的 DF

customer   activity_1  activity_2  activity_3 activity_4 
    1         40         null        30         null
    2         41         null       null        null
    3         60          50         60          75
    4        null        null       null        null
    5        null         20         40          10 

问题1: 现在我需要使用嵌套的 if 函数添加一列,如果所有活动都为空,则返回 0,如果至少一个活动不为空,则返回 1,如果至少两个活动不为空,则返回 2,如果所有活动都不是,则返回 4空。

我试图解决的问题是:

def act(x):
    if (x['activity_1'] != 'null'):
         return 1
    elif (x['activity_1'] != 'null') & (x['activity_2'] != 'null'):
        return 2
    elif (x['activity_1'] != 'null') & (x['activity_2'] != 'null') & (x['activity_3'] != 'null'):
        return 3
    elif (x['activity_1'] != 'null') & (x['activity_2'] != 'null') & (x['activity_3'] != 'null') & (x['activity_4'] != 'null'):
        return 4
    else:
       return 0

然后:

df['act'] = df.apply(act, axis=1)

问题2: 添加一列,其中包含每个案例中存在的活动的名称。

到目前为止,我尝试的是定义另一个嵌套 if 函数,该函数检查新列中的值是否为 1 返回活动 1 等等

非常感谢!

【问题讨论】:

  • 到目前为止我尝试过什么?看来你想让我们为你写代码..
  • 我将代码添加到问题中
  • 问题已更新,抱歉误导
  • 谢谢 ;),否决票已删除。

标签: python pandas jupyter


【解决方案1】:

您可以使用带有掩码的sumjoin 来获取特定列范围的空计数和非空列的列名,即

#Question 1
df["sum"] = df.apply(lambda row: sum(row[1:5]=='null') ,axis=1)

#Question 2
mask = (df[df.columns[1:5]]!='null')
df["activity"] = df.apply(lambda row: ','.join(mask.columns[row[1:5]!='null']),axis=1)

你也可以使用:

df["sum"] = df.iloc[:,1:].eq('null').sum(axis=1)

df['activity'] = df.iloc[:,1:5].ne('null').apply(lambda x: ','.join(df.columns[1:5][x]), axis=1)

输出:

客户活动_1 活动_2 活动_3 活动_4 总和\ 0 1 40 无 30 无 2 1 2 41 无 无 无 3 2 3 60 50 60 75 0 3 4 null null null null 4 4 5 无 20 40 10 1 活动 0 活动_1,活动_3 1 个活动_1 2 活动_1,活动_2,活动_3,活动_4 3 4 活动_2,活动_3,活动_4 在 [1310] 中:

希望对你有帮助

【讨论】:

  • 太完美了!
  • 很高兴为您提供帮助!
【解决方案2】:

这是一个 one 三个班轮,首先将您的“空”字符串转换为 numpy.NaN 值:

# Assuming your dataframe is already created and assigned to `df`
import numpy as np
df = df.replace("null", np.NaN)
df = df.assign(count_null=lambda x: 4 - x.isnull().sum(axis=1))

注意事项:

  • 使用assign 创建一个新列,命名为count_null,但可以随意更改。
  • 我已将 4 硬编码为列数,因此如果 DF 会改变形状,您可能希望将其设为动态
  • 使用 lambda 将 DF 分配给 x,我们使用 .isnull 方法根据内容是否为空将列汇总为 True / False。
  • 对结果求和,使用 axis=1 水平跨行而不是默认的垂直系列方法。

编辑:我添加了将“null”字符串转换为 NaN 值的代码,这将允许您执行其他考虑 null 值的内置 Pandas 计算.如果 DataFrame 变大,这些操作可能会比字符串比较快。

【讨论】:

  • 'null'是一个字符串,这里怎么用isnull()?
  • @Bharathshetty 啊,错过了。已更新为使用 NaN / null 行为以供将来参考的替代方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多