Прежде всего, общий комментарий: Pandas потрясающий, но в тот момент, когда вы начинаете иметь кортежи внутри списков внутри столбцов, это, вероятно, больше не правильный инструмент.Pandas предназначен для табличных данных, и то, с чем вы имеете дело, явно более структурировано.
Как говорится, вот мое решение.
Во-первых, давайте создадим DataFrame
(чтобыПример является воспроизводимым):
import pandas as pd
df = pd.DataFrame({
'col_1': ['xyz', 'dsja', 'dgsag'],
'col_2': [123, 32421, 3252],
'col_3': [
[('ab','cv'),('da','ndfds')],
[('ab','cv')],
[('dsfsa','sfa'),('sd','sfag')]]
})
, что дает
>>> df
col_1 col_2 col_3
0 xyz 123 [(ab, cv), (da, ndfds)]
1 dsja 32421 [(ab, cv)]
2 dgsag 3252 [(dsfsa, sfa), (sd, sfag)]
Теперь подсчет вхождений выполняется просто через collections.Counter
, и вам нужно сначала объединить все эти списки:
from collections import Counter
Counter(t for row in df['col_3'] for t in row)
Counter({('ab', 'cv'): 2,
('da', 'ndfds'): 1,
('dsfsa', 'sfa'): 1,
('sd', 'sfag'): 1})
объект Counter
, который вы получаете, имеет метод most_common
, который принимает в качестве аргумента количество элементов, которые вы хотите (например, 3 наиболее распространенных вхождения).
Теперь вторая точкаэто просто логическая индексация.Вы можете индексировать с помощью loc
и (улучшено на основе других ответов ниже) использовать генератор для сравнения:
t = ('ab', 'cv')
df.loc[(t in l for l in df['col_3']), :]
col_1 col_2 col_3
0 xyz 123 [(ab, cv), (da, ndfds)]
1 dsja 32421 [(ab, cv)]