У меня действительно есть проблема с моим фреймом данных, действительно, скажем, у меня есть фрейм данных:
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)
Как вы можете видеть в строках 2,3 и 4 в кластере 1:
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)]
и это занимает много памяти.