Python: Как получить статистику позиции каждого элемента в нескольких списках? - PullRequest
0 голосов
/ 28 августа 2018

Я хочу проанализировать элементы последовательности элементов и позиции в последовательности, в которой элемент отображается.

Например:

dataframe['sequence_list'][0] = ['a','b', 'f', 'e']
dataframe['sequence_list'][1] = ['a','c', 'd', 'e']
dataframe['sequence_list'][2] = ['a','d']
...
dataframe['sequence_list'][i] = ['a','b', 'c']

Что я хочу получить: Сколько раз «а» появляется в позициях 0, 1, 2, 3 списка? Сколько раз «b» появляется в позициях 0, 1, 2, 3 списка? ...

Вывод будет выглядеть так:

output[1,'a'] = 4
output[2,'a'] = 0
output[3,'a'] = 0
output[4,'a'] = 0
output[1,'b'] = 2
...  

Формат вывода может быть другим. Я просто хочу сказать, есть ли какая-нибудь быстрая методология матричных вычислений, помогающая мне быстро получить статистику?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Начните с преобразования списков в Серии, используя одно из двух утверждений:

df_ser = dataframe.sequence_list.apply(pd.Series)
df_ser = pd.DataFrame(dataframe.sequence_list.tolist()) # ~30% faster?

Столбцы нового информационного кадра - это позиции позиций для каждой строки:

#   0  1    2    3
#0  a  b    f    e
#1  a  c    d    e
#2  a  d  NaN  NaN
#3  a  b    c  NaN

Преобразовать номера столбцов в индекс второго уровня, а затем индекс второго уровня в собственный столбец:

df_col = df_ser.stack().reset_index(level=1)

#   level_1  0
#0        0  a
#0        1  b
#0        2  f
#....

Подсчитайте комбинации. Это ваш ответ:

output = df_col.groupby(['level_1', 0]).size()

#level_1  0
#0        a    4
#1        b    2
#         c    1
#         d    1
#2        c    1
#         d    1
#         f    1
#3        e    2

Вы можете использовать его как словарь:

output.to_dict()
#{(0, 'a'): 4, (1, 'b'): 2, (1, 'c'): 1, (1, 'd'): 1, 
# (2, 'c'): 1, (2, 'd'): 1, (2, 'f'): 1, (3, 'e'): 2}

Все в одной строке:

dataframe.sequence_list.apply(pd.Series)\      
         .stack().reset_index(level=1)\
         .groupby(['level_1',0]).size().to_dict()
0 голосов
/ 28 августа 2018

Setup

Использование настроек

df = pd.DataFrame({'col': [['a','b', 'f', 'e'], ['a','c', 'd', 'e'], ['a','d'], ['a','b', 'c']]})

col
0   [a, b, f, e]
1   [a, c, d, e]
2   [a, d]
3   [a, b, c]

Вы можете apply + Counter

pd.DataFrame(df.col.tolist()).apply(Counter)

, что дает

0                             {'a': 4}
1             {'b': 2, 'c': 1, 'd': 1}
2    {'f': 1, 'd': 1, None: 1, 'c': 1}
3                    {'e': 2, None: 2}
dtype: object

для каждого индекса.

Вы можете просто анализировать данные так, как вам нужно, например, Заполните ваши дикты сейчас, чтобы добавить нули или отключить, если это так, None s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...