首页 > 解决方案 > 如何根据以上行选择行 | Python - 熊猫

问题描述

0| name1 | name2 | tot |
 +-------+-------+-----+
1|   A   |   B   |  3  |
2|   C   |   A   |  3  |
3|   B   |   D   |  4  |
4|   A   |   E   |  2  |
5|   B   |   C   |  5  |
 +-------+-------+-----+

我想根据先前的行选择行,其中“字母”出现在其他行中至少 2 次以上(分别在 name1 或 name2 中)并且它们的总数 >= 3。

在这个例子中,我想选择:

A    E   2
B    C   5

因为在第 4 行,我们有 A (name1) 出现在第 1 行和第 2 行,tot >= 3; 和 BC 5 行,因为我们有 B 出现在第 1 行和第 3 行,tot >= 3。

附言。我想根据这些新结果创建另一个数据集

标签: pythonpandasdatasetrows

解决方案


您可以使用构建缓存collections.defaultdict

from collections import defaultdict

df = pd.DataFrame({'name1': list('ACBAB'), 'name2': list('BADEC'), 'tot': [3, 3, 4, 2, 5]})

seen = defaultdict(int) # every new key will be initialized with 0
keep = []
for row in df.itertuples():
    keep.append(
        (seen[row.name1] > 1) |
        (seen[row.name2] > 1)
    )
    if row.tot >= 3:
        # we can do this safely without risk of KeyError because `seen` is a default dict
        seen[row.name1] += 1 
        seen[row.name2] += 1

out = df[keep]

输出

  name1 name2  tot
3     A     E    2
4     B     C    5

推荐阅读