我正在尝试使用数据框中两列的两个值并执行qcut
分类。
单值分类非常简单。但是,作为对和vs的两个变量是我想要的东西。
输入:
date,startTime,endTime,day,c_count,u_count
2004-01-05,22:00:00,23:00:00,Mon,18944,790
2004-01-05,23:00:00,00:00:00,Mon,17534,750
2004-01-06,00:00:00,01:00:00,Tue,17262,747
2004-01-06,01:00:00,02:00:00,Tue,19072,777
2004-01-06,02:00:00,03:00:00,Tue,18275,785
2004-01-06,03:00:00,04:00:00,Tue,13589,757
2004-01-06,04:00:00,05:00:00,Tue,16053,735
2004-01-06,05:00:00,06:00:00,Tue,11440,636
2004-01-06,06:00:00,07:00:00,Tue,5972,513
2004-01-06,07:00:00,08:00:00,Tue,3424,382
2004-01-06,08:00:00,09:00:00,Tue,2696,303
2004-01-06,09:00:00,10:00:00,Tue,2350,262
2004-01-06,10:00:00,11:00:00,Tue,2309,254
使用纯python的代码,但我试图在pandas中做同样的事情。
for row in csv.reader(inp):
if int(row[1])>(0.80*c_count) and int(row[2])>(0.80*u_count):
val='highly active'
elif int(row[1])>=(0.60*c_count) and int(row[2])<=(0.60*u_count):
val='active'
elif int(row[1])<=(0.40*c_count) and int(row[2])>=(0.40*u_count):
val='event based'
elif int(row[1])<(0.20*c_count) and int(row[2])<(0.20*u_count):
val ='situational'
else:
val= 'viewers'
我想找到的是什么?
c_count
和u_count
c_count
vs u_count
答案 0 :(得分:1)
您可以为每个分位数组创建一个系列:
q = df[['c_count', 'u_count']].apply(lambda x: pd.qcut(x, np.linspace(0, 1, 6),
labels=np.arange(5)))
q
Out:
c_count u_count
0 4 4
1 3 3
2 3 2
3 4 4
4 4 4
5 2 3
6 2 2
7 2 2
8 1 1
9 1 1
10 0 0
11 0 0
12 0 0
0表示前20%,1表示20%-40%并继续。
现在if逻辑在这里工作有点不同。对于else部分,首先填充列:
df['val'] = 'viewers'
如果条件满足,我们之后执行的任何操作都将覆盖此列中的值。因此,我们稍后执行的操作先于前一操作。从下到上:
df.ix[(q['c_count'] < 1) & (q['u_count'] < 1), 'val'] = 'situational'
df.ix[(q['c_count'] < 2) & (q['u_count'] > 1), 'val'] = 'event_based'
df.ix[(q['c_count'] > 2) & (q['u_count'] < 2), 'val'] = 'active'
df.ix[(q['c_count'] > 3) & (q['u_count'] > 3), 'val'] = 'highly active'
第一个条件检查c_count和u_count是否都在前20%。如果是这样,请将'val'列中的相应行更改为“情境”。其余的以类似的方式工作。您可能需要稍微调整一下比较运算符(更大与大于或等于)。