【问题标题】:Sum of count where values are less than row值小于行的计数总和
【发布时间】:2019-03-30 04:43:26
【问题描述】:

我正在使用 Pandas 提出新列,该列将搜索具有值 [1-100] 的整个列,并计算小于当前行的值。

参见下面的 [df] 示例:

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

基本上,对于每一行,我需要查看整个 A 列,并计算有多少值小于当前行。因此对于值 5,有 4 个值小于 ( p>

最简单的方法是什么?

谢谢!

【问题讨论】:

标签: python pandas


【解决方案1】:

这样做的一种方法是使用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

【讨论】:

  • 我认为输出需要一点点调整。
  • @Wen-Ben 谢谢。
  • @Wen-Ben LOL 我知道这可以通过排名来完成。我不得不偶然发现所有的排名方法。 :)
  • 现在看起来好多了:-)
  • 谢谢!我本来想用排名,但我不知道你可以用 min 方法减去 1。天才!
【解决方案2】:

我正在使用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

【讨论】:

  • 是否可以添加计时?我想排名应该更快,但在大数据中不能 100% 确定。
  • @jezrael 我也有同感 :-)
  • 是否可以添加计时?
  • 谢谢,只是不确定timeit使用了哪些数据?
  • @jezrael 添加 :-)
【解决方案3】:

试试这个代码

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

【讨论】:

    【解决方案4】:

    你可以这样做:

    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
    

    【讨论】:

      【解决方案5】:

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

      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
      

      【讨论】:

        【解决方案6】:

        您没有指定速度或内存使用是否重要(或者您是否有一个非常大的数据集)。 “最简单”的方法很简单:计算列中每个条目的数量小于 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
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-02-05
          • 1970-01-01
          • 2020-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多