编写一个简单的计数器

Scripting a simple counter

我想创建一个简单的脚本,计算一列中的值,而另一列中的值更高:

d = {'a': [1, 3], 'b': [0, 2]}
df = pd.DataFrame(data=d, index=[1, 2])

print(df)
   a  b
1  1  0
2  3  2

我的函数:


def diff(dataframe):
    a_counter=0
    b_counter=0
    
    for i in dataframe["a"]:
        for ii in dataframe["b"]:
            if i>ii:
                a_counter+=1
            elif ii>i:
                b_counter+=1

    return a_counter, b_counter

然而

diff(df)

returns (3, 1),而不是 (2,0)。我知道问题是一列的每个值都与另一列的每个值进行比较(例如,1 与 b 列的 0 和 2 进行比较)。可能有一个特殊的功能可以解决我的问题,但是你能帮我修复我的脚本吗?

更新

也许你可以使用:

>>> df['a'].gt(df['b']).sum(), df['b'].gt(df['a']).sum()
(2, 0)

IIUC,修复您的代码:

def diff(dataframe):
    a_counter=0
    b_counter=0
    
    for i in dataframe["a"]:
        for ii in dataframe["b"]:
            if i>ii:
                a_counter+=1
            elif ii>i:
                b_counter+=1

    # Subtract the minimum of counters
    m = min(a_counter, b_counter)   
    return a_counter-m, b_counter-m

输出:

>>> diff(df)
(2, 0)

IIUC,可以用差值的符号来计数:

d = {1: 'a', -1: 'b', 0: 'equal'}

(np.sign(df['a'].sub(df['b']))
   .map(d)
   .value_counts()
   .reindex(list(d.values()), fill_value=0)
)

输出:

a        2
b        0
equal    0
dtype: int64

我建议以直观的方式添加一些辅助列,以帮助计算每个条件 a > bb > a

的总和

基于您的代码的工作示例:

import numpy as np
import pandas as pd

d = {'a': [1, 3], 'b': [0, 2]}
df = pd.DataFrame(data=d, index=[1, 2])

def diff(dataframe):
    dataframe['a>b'] = np.where(dataframe['a']>dataframe['b'], 1, 0)
    dataframe['b>a'] = np.where(dataframe['b']>dataframe['a'], 1, 0)
    return dataframe['a>b'].sum(), dataframe['b>a'].sum()

print(diff(df))

>>> (2, 0)

基本上 np.where() 的作用,我使用它的方式是,如果满足条件,它会产生 1,否则会产生 0。然后,您可以使用应用于所需列的简单 sum() 函数来添加这些列。