Подсчет элементов в списке в Pandas с помощью apply - PullRequest
0 голосов
/ 16 октября 2018

У меня есть DataFrame:

df = pd.DataFrame({
'keywords': [['a', 'b', 'c'], ['c', 'd'], ['a', 'b', 'c', 'd'], ['b', 'c', 'g', 'h', 'i']]})

Я хочу подсчитать количество элементов в DataFrame внутри списков по всем строкам, используя df.apply .Я ожидаю, что приведенный выше DataFrame даст:

a: 2
b: 3
c: 4
d: 2
g: 1
h: 1
i: 1

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Во-первых, обратите внимание, что вы можете использовать "sum" для объединения списков, потому что + объединяет списки в Python:

df.keywords.sum()
# out: ['a', 'b', 'c', 'c', 'd', 'a', 'b', 'c', 'd', 'b', 'c', 'g', 'h', 'i']

Затем либо:

import collections
collections.Counter(df.keywords.sum())
# out: Counter({'a': 2, 'b': 3, 'c': 4, 'd': 2, 'g': 1, 'h': 1, 'i': 1})

Или:

np.unique(df.keywords.sum(), return_counts=True)
# out: (array(['a', 'b', 'c', 'd', 'g', 'h', 'i'], dtype='<U1'),  array([2, 3, 4, 2, 1, 1, 1]))

Или:

uniq = np.unique(df.keywords.sum(), return_counts=True)
pd.Series(uniq[1], uniq[0])
# out:
a    2
b    3
c    4
d    2
g    1
h    1
i    1

Или:

pd.Series(collections.Counter(df.keywords.sum()))
# out: same as previous

Производительность примерно одинакова, используете ли вы np.unique() или collections.Counter, потому что df.keywords.sum() на самом деле не так быстро.Если вы заботитесь о производительности, чистое выравнивание списка Python гораздо быстрее:

collections.Counter([item for sublist in df.keywords for item in sublist])
0 голосов
/ 16 октября 2018

Вы можете использовать чистое решение Python для выравнивания с chain, если важна производительность и считать значения с помощью Counter, последнее использование DataFrame Конструктор:

from itertools import chain
from collections import Counter

c = Counter(chain.from_iterable(df['keywords'].tolist())) 

df = pd.DataFrame({'a': list(c.keys()), 'b':list(c.values())})
print (df)
   a  b
0  a  2
1  b  3
2  c  4
3  d  2
4  g  1
5  h  1
6  i  1

Или:

df = pd.DataFrame(df['keywords'].values.tolist()).stack().value_counts().to_frame('a')
print (df)
   a
c  4
b  3
a  2
d  2
g  1
i  1
h  1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...