python - 使用 qcut pandas 进行多个有值(value)的分类

标签 python validation csv pandas

我正在尝试使用数据框中两列中的两个值并执行 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编写代码,但我试图在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'

我想要找到的是?

  1. c_countu_count 均为
  2. 如上面的代码 c_countu_count

最佳答案

您可以为每个分位数组创建一个系列:

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

关于python - 使用 qcut pandas 进行多个有值(value)的分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39044434/

相关文章:

python - 如何从原始数据字符串制作字典

javascript - jQuery 返回多个函数不起作用

python strip 函数没有给出预期的输出

java - 使用java将CSV文件转换为LDIF文件

python - 在Python中返回满足特定条件的项目的最佳方法是什么

python - python中的mongo查询

asp.net-mvc - 将 BootstrapValidator 与 MVC DataAnnotations 一起使用

html - 需要一些验证错误的帮助

javascript - CasperJS - 下载没有 URL 的生成文件

python - 非事件窗口截图 PrintWindow + win32gui