嵌套if是否检查一个或多个pandas列是否满足条件

时间:2017-08-04 08:20:06

标签: python pandas jupyter

我有一个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函数添加一个列,如果所有活动都为null则返回0,如果至少一个活动不为null则返回1,如果至少两个活动不为null则返回2,如果所有活动都不为null则返回到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依此类推

非常感谢!

2 个答案:

答案 0 :(得分:2)

这里有一个一个三个班轮,首先转换你的" null"将字符串转换为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,具体取决于内容是否为空。< / LI>
  • 对结果求和,使用axis=1横向划分行而不是默认的垂直系列方法。

修改:我已添加了转换&#34; null&#34;的代码。字符串到NaN值,这将允许您执行其他内置的Pandas计算,并考虑空值。如果DataFrame变大,这些操作可能比字符串比较更快。

答案 1 :(得分:2)

您可以使用带有掩码的join#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)

您也可以使用:

Highcharts.stockChart('highchartLineChart', {
    title: {
        text: 'MyTitle'
    },
    subtitle: {
        text: ''
    },
    xAxis: {
        title: {
            enabled: true,
            text: 'Time (days)'
        },
        type: 'datetime',
    },
    yAxis: {
        title: {
            text: 'Value'
        },
    },
    navigator: {
        enabled: true,
        series: {
            id: 'navigator',
        }
    },
    series: []
});

Ouptut:

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

                                      activity  
0                        activity_1,activity_3  
1                                   activity_1  
2  activity_1,activity_2,activity_3,activity_4  
3                                               
4             activity_2,activity_3,activity_4  
In [1310]:

希望有所帮助