值小于行的计数总和

时间:2019-03-29 19:57:11

标签: python pandas

我正在使用Pandas来创建新列,该列将在整个列中搜索[1-100]值,并将计算小于当前行的值。

请参见下面的[df]示例:

[A][NewCol]
 1 0
 3 2
 2 1
 5 4
 8 5
 3 2

基本上,对于每一行,我需要查看整个Column A,并计算比当前行少多少个值。因此,对于值 5 ,有 4 个值小于(<)小于5(1,2,3,3)。

最简单的方法是什么?

谢谢!

6 个答案:

答案 0 :(得分:7)

一种这样做的方法,将rankmethod='min'一起使用:

df['NewCol'] = (df['A'].rank(method='min') - 1).astype(int)

输出:

   A  NewCol
0  1       0
1  3       2
2  2       1
3  5       4
4  8       5
5  3       2

答案 1 :(得分:7)

我正在使用numpy广播

s=df.A.values
(s[:,None]>s).sum(1)
Out[649]: array([0, 2, 1, 4, 5, 2])

#df['NewCol']=(s[:,None]>s).sum(1)

定时

df=pd.concat([df]*1000)

%%timeit
s=df.A.values
(s[:,None]>s).sum(1)
10 loops, best of 3: 83.7 ms per loop
%timeit (df['A'].rank(method='min') - 1).astype(int)
1000 loops, best of 3: 479 µs per loop

答案 2 :(得分:1)

尝试此代码

A = [Your numbers]
less_than = []
    for element in A:
        counter = 0
        for number in A:
            if number < element:
                counter += 1
        less_than.append(counter)

答案 3 :(得分:1)

您可以这样做:

import pandas as pd

df = pd.DataFrame({'A': [1,3,2,5,8,3]})

df['NewCol'] = 0
for idx, row in df.iterrows():
    df.loc[idx, 'NewCol'] = (df.loc[:, 'A'] < row.A).sum()

print(df)
   A  NewCol
0  1       0
1  3       2
2  2       1
3  5       4
4  8       5
5  3       2

答案 4 :(得分:1)

另一种方法是排序和重置索引:

m=df.A.sort_values().reset_index(drop=True).reset_index()
m.columns=['new','A']
print(m)

   new  A
0    0  1
1    1  2
2    2  3
3    3  3
4    4  5
5    5  8

答案 5 :(得分:1)

您没有指定速度或内存使用情况是否重要(或者是否有非常大的数据集)。做到这一点的“最简单”方法是直截了当的:为该列中的每个条目计算比i少多少个并将它们收集到新列中:

df=pd.DataFrame({'A': [1,3,2,5,8,3]})
col=df['A']
df['new_col']=[ sum(col<i) for i in col ]

print(df)

结果:

   A  new_col
0  1        0
1  3        2
2  2        1
3  5        4
4  8        5
5  3        2

在大型数据集上可能有更有效的方法,例如首先对列进行排序。