Панды: Как напечатать строки, содержащие указанный элемент списка - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть фрейм данных, который выглядит следующим образом (пример):

column1     column2            column3
  xyz         123         [(ab,cv), (da,ndfds)]
  dsja        32421            [(ab,cv)]
  dgsag       3252        [(dsfsa,sfa), (sd,sfag)]
 ....................

Прежде всего я хотел бы получить наиболее часто встречающиеся пары во всех списках.Например:

 (ab,cv)    2
 (da,ndfds) 1
 ..........

Я хотел бы иметь возможность вызвать все строки, которые содержат, например, запись (ab, cv) в column3.

Ожидаемый результат для этого будет:

 column1     column2            column3
  xyz         123         [(ab,cv), (da,ndfds)]
  dsja        32421            [(ab,cv)]
  .....................      

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Это должно сделать:

df[('ab','cv') in l for l in df.column3]
    column1 column2 column3
0   xyz 123 [(ab,cv),(da,ndfds)]
1   dsja    32421   [(ab,cv)]
0 голосов
/ 17 февраля 2019

Прежде всего, общий комментарий: 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)]
0 голосов
/ 17 февраля 2019

IIUC

df[[any(y in l for y in x) for x in df.col3]]
Out[57]: 
  col1                     col3
0    x  [(ab, cv), (da, ndfds)]
1    y               [(ab, cv)]

Ввод данных

df=pd.DataFrame({'col1':['x','y','z'],'col3':[[('ab','cv'), ('da','ndfds')],[('ab','cv')],[('dsfsa','sfa'), ('sd','sfag')]]})
l=[('ab','cv'),('da','ndfds')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...