2016-08-19 55 views
1

我试图使用来自数据框的两列中的两个值并执行qcut分类。使用qcut熊猫进行多重价值分类

单值分类很简单。但是,两个变量作为pair和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,但我试图做同样的大熊猫。

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' 

我在找什么?

  1. c_countu_count二者
  2. 如同在上面的代码c_count VS u_count
+0

此数据框中的max_user和max_key是什么?最后两列的最大值? – ayhan

+0

@ayhan是的,它们是最后两列的最大值,并且在显示的代码中进行所需的更改以避免混淆。 –

回答

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逻辑在这里有点不同。对于其他部分,首先填充列:

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”列中的相应行更改为情境。其余的以类似的方式工作。您可能需要稍微调整比较运算符(大于或大于或等于)。

+0

非常感谢你,但是对我来说这似乎有点困惑。 :(是否有可能使它变得更简单?'df2 ['cat'] = pd.qcut(df2.c_total,q = [0,2.4,.6,.8,1],labels = ['观众','基于事件','情境','主动','高度活跃'])'这个我用于单列。这样的事情? –

+1

这就像滚动的骰子。只有6个可能的结果,但如果你有两个骰子,结果的数量将是36,如果你看到的是小于或大于条件,那么这个结果将会更高。因此,无论如何,你需要做一个映射来翻译你的对Python/Pandas有自己的规则我不知道你是否可以找到比这更简单的东西 – ayhan

+0

再次感谢你..这一个也有任何可能的建议呢?http://stackoverflow.com/questions/39025705/timeseries-地块与 - 背景虚化 –