我有一个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依此类推
非常感谢!
答案 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
的新列,但更改为您喜欢的任何内容。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]:
希望有所帮助