pandas - Python Pandas 中的 COUNTIFS
问题描述
我正在尝试使用以下数据框在 Python pandas 中锻炼 countifs 函数。
import pandas as pd
df = pd.DataFrame({'var_1': ['B 1','B 2','B 3','B 4','B 5','B 6','B 7','B 4','B 8','B 1','B 3','B 9','B 7','B 6','B 4','B 2','B 4','B 4','B 3','B 7','B 7','B 7','B 9','B 4','B 3','B 1','B 2','B 4','B 4','B 2','B 1','B 3','B 9','B 4','B 2','B 4','B 9','B 1','B 10','B 4','B 3','B 8','B 4','B 3','B 2','B 1','B 4','B 7','B 4','B 3','B 1','B 2','B 8','B 11','B 4','B 2','B 7','B 4','B 7','B 3','B 1','B 4','B 9','B 1','B 3','B 4','B 2','B 4','B 2','B 3','B 1','B 4','B 4','B 7','B 4','B 2','B 8','B 1','B 3','B 6','B 2','B 4','B 5','B 1','B 4','B 7','B 4','B 2','B 1','B 4','B 2','B 8','B 9','B 4','B 2','B 3','B 1','B 4','B 12','B 1'],'var_2': ['B 1','B 2','B 3','B 4','B 5','B 6','B 7','B 4','B 8','B 1','B 3','B 9','B 7','B 6','B 4','B 2','B 4','B 4','B 3','B 7','B 7','B 7','B 9','B 4','B 3','B 1','B 2','B 4','B 4','B 2','B 1','B 3','B 9','B 4','B 2','B 4','B 9','B 1','B 10','B 4','B 3','B 8','B 4','B 3','B 2','B 1','B 4','B 7','B 4','B 3','B 1','B 2','B 8','B 11','B 4','B 2','B 7','B 4','B 7','B 3','B 6','B 4','B 9','B 6','B 3','B 4','B 2','B 4','B 2','B 3','B 6','B 4','B 4','B 7','B 4','B 2','B 8','B 1','B 3','B 6','B 2','B 4','B 5','B 1','B 4','B 7','B 4','B 2','B 1','B 4','B 2','B 8','B 9','B 4','B 2','B 3','B 1','B 4','B 12','B 1']})
- 假设我有两个变量,有 100 个不同品牌的响应
- 我有 var 1 和 var 2 的不重复列表
- 我正在创建以下新列,
- 第 1 列 - 这个品牌在多少行中有 var 1 但不在 var 2 中
- 第 2 列 - 这个品牌在多少行中有 var 2 但不在 var 1 中
- 第 3 列 - 这个品牌在多少行中有 var 1 AND ALSO var 2
- 第 4 列 - 总行数 - 第 1 列 + 第 2 列 + 第 3 列
我需要的输出格式是:
(前两行仅是条件。需要第 3 行的输出)
解决方案
利用:
m1 = df['var_1'].eq(df['var_2'])
s1 = df.loc[~m1, 'var_1'].value_counts()
s2 = df.loc[~m1, 'var_2'].value_counts()
s3 = df.loc[m1, 'var_1'].value_counts()
df1 = (pd.concat([s1, s2, s3], axis=1, keys=['c1','c2','c3'])
.fillna(0)
.astype(int)
.rename_axis('Brands'))
df1['c4'] = df1.sum(axis=1)
print (df1)
c1 c2 c3 c4
Brands
B 1 3 0 12 15
B 6 0 3 3 6
B 4 0 0 28 28
B 2 0 0 15 15
B 3 0 0 13 13
B 7 0 0 10 10
B 9 0 0 6 6
B 8 0 0 5 5
B 5 0 0 2 2
B 11 0 0 1 1
B 12 0 0 1 1
B 10 0 0 1 1
编辑:
m1 = df['var_1'].eq(df['var_2'])
s1 = df.loc[~m1, 'var_1'].value_counts()
s2 = df.loc[~m1, 'var_2'].value_counts()
s3 = df.loc[m1, 'var_1'].value_counts()
s4 = df['var_1'].append(df['var_2']).value_counts()
df1 = pd.concat([s1, s2, s3, s4],
axis=1,
keys=['c1','c2','c3','c4']).fillna(0).astype(int).rename_axis('Brands')
print (df1)
c1 c2 c3 c4
Brands
B 1 3 0 12 27
B 6 0 3 3 9
B 4 0 0 28 56
B 2 0 0 15 30
B 3 0 0 13 26
B 7 0 0 10 20
B 9 0 0 6 12
B 8 0 0 5 10
B 5 0 0 2 4
B 11 0 0 1 2
B 12 0 0 1 2
B 10 0 0 1 2
推荐阅读
- java - Dagger 2.22 - 无法向模块提供应用程序上下文
- .net-core - F# Type Providers:你可以在定义它的同一个项目中使用类型提供程序吗?
- angular - 如何使用 Angular Routing 路由到不同的页面?
- javascript - 高阶函数 - 如何?
- python - 构建多个框架的容器方法不起作用
- python - 唯一的顺序
- python - Python:获取 ParquetDataset 的行数?
- reactjs - 了解 ReactJS 中的渲染道具
- html - 为什么我的表格在尝试调整大小时会截断文本?另外,为什么桌子上没有我的名字?
- python - 使用 Flask 进行简单的日志过滤