计算值在 Pandas 范围内的出现次数
count occurrence of value over a range in Pandas
我有一个如下所示的数据框:
simple = pd.DataFrame([
(80,100 ),
(100,90 ),
(80, 90 ),
], columns=['content_x', 'content_y'])
content_x content_y
0 80 100
1 100 90
2 80 90
我想计算 content_x 中值在 content_y 列中出现的次数。 (在Excel中,我使用了countif)
最终输出如下所示:
您可以尝试通过 isin()
:
simple['count of X in Y']=simple['content_y'].isin(simple['content_x']).astype(int)
#OR(via view())
simple['count of X in Y']=simple['content_y'].isin(simple['content_x']).view('i1')
simple
的输出:
content_x content_y count of X in Y
0 80 100 1
1 100 90 0
2 80 90 0
IIUC,这是一种方式 ->
只需执行 value_count()
和 map
结果:
simple['count'] = simple.content_x.map(simple.content_y.value_counts()).fillna(0, downcast= 'infer')
您的示例输入的输出:
content_x content_y count
0 80 100 0
1 100 90 1
2 80 90 0
另一个样本输入:
content_x content_y
0 80 100
1 100 90
2 80 100
输出:
content_x content_y count
0 80 100 0
1 100 90 2
2 80 100 0
类似于 Anurag 的回答,但我认为您正在寻找每行每个数字的总计?您使用 groupby
和 transform
得到:
import pandas as pd
simple = pd.DataFrame([
(80,100 ),
(100,90 ),
(80, 90 ),
], columns=['content_x', 'content_y'])
simple['count'] = simple['content_y'].isin(simple['content_x'])
simple['count'] = simple.groupby('content_y')['count'].transform('sum')
simple
Out[1]:
content_x content_y count
0 80 100 1
1 100 90 0
2 80 90 0
让我们使用
np.in1d
与列数组相交
simple['count of X in Y']=np.in1d(simple['content_y'].values,simple['content_x'].values).astype(int)
content_x content_y count of X in Y
0 80 100 1
1 100 90 0
2 80 90 0
对于 content_x 中的每一行,对 content_y 中出现的所有事件求和。这很容易做到,因为您可以对布尔过滤器求和。然后将其添加到列表中,并在循环后将其全部设为新的数据框列。我敢肯定还有其他方法,但这个方法相当简单。
import pandas as pd
import numpy as np
df = pd.DataFrame({
'x' : [80, 100, 80],
'y' : [100, 90, 90],
})
x_in_y = []
for i in range(len(df)):
x_in_y.append( sum(df.y == df.x[i]) )
df['x_in_y'] = x_in_y
我有一个如下所示的数据框:
simple = pd.DataFrame([
(80,100 ),
(100,90 ),
(80, 90 ),
], columns=['content_x', 'content_y'])
content_x content_y
0 80 100
1 100 90
2 80 90
我想计算 content_x 中值在 content_y 列中出现的次数。 (在Excel中,我使用了countif)
最终输出如下所示:
您可以尝试通过 isin()
:
simple['count of X in Y']=simple['content_y'].isin(simple['content_x']).astype(int)
#OR(via view())
simple['count of X in Y']=simple['content_y'].isin(simple['content_x']).view('i1')
simple
的输出:
content_x content_y count of X in Y
0 80 100 1
1 100 90 0
2 80 90 0
IIUC,这是一种方式 ->
只需执行 value_count()
和 map
结果:
simple['count'] = simple.content_x.map(simple.content_y.value_counts()).fillna(0, downcast= 'infer')
您的示例输入的输出:
content_x content_y count
0 80 100 0
1 100 90 1
2 80 90 0
另一个样本输入:
content_x content_y
0 80 100
1 100 90
2 80 100
输出:
content_x content_y count
0 80 100 0
1 100 90 2
2 80 100 0
类似于 Anurag 的回答,但我认为您正在寻找每行每个数字的总计?您使用 groupby
和 transform
得到:
import pandas as pd
simple = pd.DataFrame([
(80,100 ),
(100,90 ),
(80, 90 ),
], columns=['content_x', 'content_y'])
simple['count'] = simple['content_y'].isin(simple['content_x'])
simple['count'] = simple.groupby('content_y')['count'].transform('sum')
simple
Out[1]:
content_x content_y count
0 80 100 1
1 100 90 0
2 80 90 0
让我们使用
np.in1d
与列数组相交
simple['count of X in Y']=np.in1d(simple['content_y'].values,simple['content_x'].values).astype(int)
content_x content_y count of X in Y
0 80 100 1
1 100 90 0
2 80 90 0
对于 content_x 中的每一行,对 content_y 中出现的所有事件求和。这很容易做到,因为您可以对布尔过滤器求和。然后将其添加到列表中,并在循环后将其全部设为新的数据框列。我敢肯定还有其他方法,但这个方法相当简单。
import pandas as pd
import numpy as np
df = pd.DataFrame({
'x' : [80, 100, 80],
'y' : [100, 90, 90],
})
x_in_y = []
for i in range(len(df)):
x_in_y.append( sum(df.y == df.x[i]) )
df['x_in_y'] = x_in_y