编写一个简单的计数器
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 > b
和 b > 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()
函数来添加这些列。
我想创建一个简单的脚本,计算一列中的值,而另一列中的值更高:
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 > b
和 b > 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()
函数来添加这些列。