2014-11-07 15 views
1

我有一个巨大的CSV文件,其中包含一系列项目ID的度量标准,我试图对比另一项,我想查找每个度量标准中每个项目的四分位数并将每个实际数字替换为列中的四分位数排名。下面显示了一些虚拟数据的例子。如果该度量值具有NaN值,我想完全忽略它们。所以对于Metric 2,四分位数将基于具有10个值,而不是12将DF中的值替换为相对于其他值的四分位数

ID  Metric 1  Metric 2  Metric 3 
----------------------------------------- 
1  10   4.8   155   
2  11   5.6   301 
3  7   7.9   223 
4  14   NaN   88 
5  4   NaN   109 
6  18   6.6   213 
7  13   3.9   456 
8  5   8.1   403 
9  10   9.2   353 
10  11   4.1   312 
11  9   5.3   286 
12  6   3.3   215 


ID  Metric 1  Metric 2  Metric 3 
----------------------------------------- 
1  2   2   1   
2  3   3   3 
3  2   4   2 
4  4   NaN   1 
5  1   NaN   1 
6  4   3   2 
7  4   1   4 
8  1   4   4 
9  2   4   4 
10  3   2   3 
11  2   2   3 
12  1   1   2 

的专栏中,我知道有一个更好的方式大熊猫不仅仅是通过每个细胞循环,从而做到这一点,但我不是很确定如何接近它。

回答

1

您正在寻找带有标签设置的Pandas中的qcut方法。这里有一个例子:

创建示例数据:

df1 = pd.DataFrame({'M1': randint(size=12, low=100, high = 500)}) 
df1['ID'] = df1.index 
print df1.head() 


    M1 ID 
0 281 0 
1 455 1 
2 401 2 
3 313 3 
4 432 4 

只要没有分组,简单地创建使用一个新的变量:

df1['M1Q'] = pd.qcut(df1.M1, 4, labels=[1,2,3,4]) 
print df1 

    M1 ID M1Q 
0 281 0 3 
1 455 1 4 
2 401 2 4 
3 313 3 3 
4 432 4 4 
5 208 5 3 
6 207 6 2 
7 205 7 2 
8 130 8 1 
9 126 9 1 
10 167 10 2 
11 163 11 1 

根据帮助文件qcut()不你用空值表达什么。但我们不妨向自己证明这一点。因此,让我们吹出来的一些数据,并再次运行:

df1.M1.iloc[8:] = NaN 
df1['M1Q'] = pd.qcut(df1.M1, 4, labels=[1,2,3,4]) 
print df1 

    M1 ID M1Q 
0 356 0 3 
1 466 1 4 
2 420 2 3 
3 429 3 4 
4 165 4 1 
5 140 5 1 
6 231 6 2 
7 230 7 2 
8 NaN 8 NaN 
9 NaN 9 NaN 
10 NaN 10 NaN 
11 NaN 11 NaN 

我觉得看起来像你是什么之后。祝你好运!

+0

这是完美的,谢谢 – weskpga 2014-11-09 04:39:28

相关问题