我创建了以下 MWE
data = {'Name': ['Tom', 'Tom', 'Tom', 'Tom', 'Tom', 'Tom', 'Tom' , 'Tom', 'Tom', 'Tom'], 'Article': ['A', 'A', 'A', 'B', 'B', 'A', 'A', 'A', 'B', 'B'], 'Weekday' : [1,2,3,2,3,1,2,3, 1, 2], 'Value': [1,40,3,91,10,6,9,10, 20, 10]}
df_test = pd.DataFrame(data)
Name Article Weekday Value
0 Tom A 1 1
1 Tom A 2 40
2 Tom A 3 3
3 Tom B 2 91
4 Tom B 3 10
5 Tom A 1 6
6 Tom A 2 9
7 Tom A 3 10
8 Tom B 1 20
9 Tom B 2 10
其中一个组由名称-文章对组成。我想过滤掉所有现有三个工作日的值中计数不至少为 2 的所有组。因此,应该只存在具有三个工作日 (1,2,3) 且至少有两个计数的组。如果名称文章只有两个工作日且至少有两个计数,则也应该将其过滤掉。
预期的输出应该是这样的
Name Article Weekday Value
0 Tom A 1 1
1 Tom A 2 40
2 Tom A 3 3
5 Tom A 1 6
6 Tom A 2 9
7 Tom A 3 10
最佳答案
如果您想确保每个 Name
/Article
每个 Weekday
至少有 2 个计数,您可以计算一个crosstab
计算 Name
/Article
和 Weekday
的组合。
然后您可以使用任何您想要的过滤器,这里我们保留具有 all
的 Name
/Article
组合至少 2 个值:
counts = pd.crosstab([df_test['Name'], df_test['Article']], df_test['Weekday'])
keep = counts[counts.ge(2).all(axis=1)]
out = df_test.set_index(['Name', 'Article']).loc[keep.index].reset_index()
# or
# out = df_test.merge(keep[[]].reset_index())
要计算所有
天,而仅计算给定数字(例如 ≥3),请使用:
keep = counts[counts.ge(2).sum(axis=1).ge(3)]
输出:
Name Article Weekday Value
0 Tom A 1 1
1 Tom A 2 40
2 Tom A 3 3
3 Tom A 1 6
4 Tom A 2 9
5 Tom A 3 10
中间计数
:
Weekday 1 2 3
Name Article
Tom A 2 2 2 # all 3 have ≥ 2, we keep
B 1 2 1 # not all ≥ 2, discard
关于python - pandas:根据条件过滤整个组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75681421/