我正在使用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)。>
最简单的方法是什么?
谢谢!
答案 0 :(得分:7)
一种这样做的方法,将rank
与method='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
在大型数据集上可能有更有效的方法,例如首先对列进行排序。