python - 如何根据以上行选择行 | 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。
附言。我想根据这些新结果创建另一个数据集
解决方案
您可以使用构建缓存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
推荐阅读
- r - 使用 Rselenium 对链接向量进行抓取循环会给出“错误摘要:NoSuchWindow”
- maxima - 在 Maxima 中对非连续函数执行拉普拉斯变换
- java - 为什么我的程序会导致多个空指针异常?
- python - 有没有合适的方法来解决层次分类中的 LCPN 方法
- java - 是否可以通过知道进程的 PID 来控制进程?
- python - 计算列表列表中项目的每个实例并将它们相加
- python - 使用for循环python重命名目录中的文件名
- typescript - Typescript 中的异构函数图
- ruby-on-rails - Rails has_man 通过关联
- mysql - Mysql Driver 类 com.mysql.jdbc.Driver 不是来自 wildfly 的有效 javax.sql.DataSource 实现