python - 过滤数据框中的反向行(熊猫)
问题描述
我的数据框实际上有问题,确实可以说我有一个这样的数据框:
cluster_name qseqid sseqid pident_x qstart qend sstar send
2 1 seq1_0035_0035 seq13_0042_0035 0.73 42 133 46 189
3 1 seq1_0035_0035 seq13_0042_0035 0.73 146 283 287 389
4 1 seq1_0035_0035 seq13_0042_0035 0.73 301 478 402 503
5 1 seq13_0042_0035 seq1_0035_0035 0.73 46 189 42 133
6 1 seq13_0042_0035 seq1_0035_0035 0.73 287 389 146 283
7 1 seq13_0042_0035 seq1_0035_0035 0.73 402 503 301 478
8 2 seq4_0042_0035 seq2_0035_0035 0.71 256 789 125 678
9 2 seq4_0042_0035 seq2_0035_0035 0.71 802 1056 706 985
10 2 seq4_0042_0035 seq7_0035_0042 0.83 123 745 156 723
12 4 seq11_0035_0035 seq14_0042_0035 0.89 145 647 236 921
13 4 seq11_0035_0035 seq17_0042_0042 0.97 148 623 241 1002
14 5 seq17_0035_0042 seq17_0042_0042 0.94 188 643 179 746
...
(200 000 ROWS)
正如您在集群 1 中的第 2,3 和 4 行中看到的:
cluster_name qseqid sseqid pident_x qstart qend sstar send
2 1 seq1_0035_0035 seq13_0042_0035 0.73 42 133 46 189
3 1 seq1_0035_0035 seq13_0042_0035 0.73 146 283 287 389
4 1 seq1_0035_0035 seq13_0042_0035 0.73 301 478 402 503
集群 1 中的 5、6 和 7 中存在倒数(反向):
cluster_name qseqid sseqid pident_x qstart qend sstar send
1 1 seq13_0042_0035 seq1_0035_0035 0.73 46 189 42 133
6 1 seq13_0042_0035 seq1_0035_0035 0.73 287 389 146 283
7 1 seq13_0042_0035 seq1_0035_0035 0.73 402 503 301 478
如果你看不太清楚,它会像:
seq 1 vs seq 2 : (here seq1_0035_0035 vs seq13_0042_0035)
和
seq 2 vs seq 1 : ( here seq13_0042_0035 vs seq1_0035_0035)
这是相同的比较,我只想保留其中一个,而不是两者。
例如,在我的最终数据框中只保留 2,3 和 4 或 4,5 和 6,如果我只保留它会给出的第一个:
cluster_name qseqid sseqid pident_x qstart qend sstar send
2 1 seq1_0035_0035 seq13_0042_0035 0.73 42 133 46 189
3 1 seq1_0035_0035 seq13_0042_0035 0.73 146 283 287 389
4 1 seq1_0035_0035 seq13_0042_0035 0.73 301 478 402 503
8 2 seq4_0042_0035 seq2_0035_0035 0.71 256 789 125 678
9 2 seq4_0042_0035 seq2_0035_0035 0.71 802 1056 706 985
10 2 seq4_0042_0035 seq7_0035_0042 0.83 123 745 156 723
12 4 seq11_0035_0035 seq14_0042_0035 0.89 145 647 236 921
13 4 seq11_0035_0035 seq17_0042_0042 0.97 148 623 241 1002
14 5 seq17_0035_0042 seq17_0042_0042 0.94 188 643 179 746
如您所见,8 和 9 是相同的序列,但它们没有相同的 seq 坐标(qstart、qend、sstar 和 send),然后我保留它们。
我已经要求过这样的事情,但我实际上有一个大约 200 000 行的数据框,我想找到一个解决方案,既不会耗费太多时间,也不会占用太多内存,因为我以前的解决方案需要很多时间和记忆...
有人有想法吗?
非常感谢您的帮助。
第一次尝试是:
df[~pd.DataFrame({
'tup': df[['sseqid', 'qseqid']].apply(tuple, axis=1),
'inv_tups': df[['qseqid', 'sseqid']].apply(lambda t: (tuple(t), ), axis=1).cumsum().shift(1)}
).apply(lambda r: isinstance(r.inv_tups, tuple) and r.tup in r.inv_tups, axis=1)]
但是 200 000 行需要很长时间。
另一个是:
this = data[["qseqid", "sseqid"]].apply(tuple, axis=1)
cum = pd.get_dummies(data[["sseqid", 'qseqid']].apply(tuple, axis=1)).cumsum()
this_zeros = pd.get_dummies(this)
this_zeros[:] = 0
pd.concat([cum, this_zeros[this_zeros.columns.difference(cum.columns)]], axis=1)
keep = pd.concat([cum, this_zeros[this_zeros.columns.difference(cum.columns)]], axis=1).lookup(data.index, this)
data=data[keep.astype(bool)]
它需要很多内存。
解决方案
推荐阅读
- django - 如何在 django 中从一个应用程序向另一个应用程序发出通知?
- flutter - 当我启动时,第一页(Dart 文件)将在 Flutter App 中运行
- reactjs - 优化 reactjs 中的拖动单元格表?
- r - 比较两条曲线的趋势差异
- openmpi - abinit 中的字符串方法教程 - 未生成输出文件
- python - 如何读取我的 exel 表中的特定数据并从读取的每个数据集创建一个图?(Python)
- java - Adler32 生成的校验和与 .txt 文件校验和不匹配
- python - Python:根据匹配从列表中写入文件
- angular - 如何在 Angular 中正确配置路由
- excel - 交互式 Excel 图表:根据下拉选择获取多列的值