подсчитать общее количество элементов списка в столбце панд - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть датафрейм pandas A со столбцом keywords как (здесь я показываю только 4 строки, но на самом деле их миллионы): -

 keywords
 ['loans','mercedez','bugatti']
 ['trump','usa']
 ['galaxy','7s','canon','macbook']
 ['beiber','spiderman','marvels','ironmen']

Я хочу суммировать общее количество элементов списка в столбце keywords и сохранить его в некоторой переменной. Что-то вроде

total_sum=elements in keywords[0]+elements in keywords[1]+elements in 
          keywords[2]+elements in keywords[3]

total_sum=3+2+4+4
total_sum=13

Как я могу сделать это в пандах?

Ответы [ 6 ]

0 голосов
/ 09 сентября 2018

Больше похоже на проблему сглаживания списка

import itertools
len(list(itertools.chain(*df.keywords.values.tolist())))
Out[57]: 13
0 голосов
/ 09 сентября 2018

Вы можете попробовать это:

df.keywords.map(len).sum()
0 голосов
/ 09 сентября 2018

Метод 1:

len([item for sublist in df.keywords for item in sublist]

Метод 2:

df.keywords.apply(len).sum()

.

df = [{"item": "a", "item_price": [1,1.5,2]}, {"item": "b", "item_price": [0.5,0.75,1]}]
df = pd.DataFrame(df)
print(df)
print("Ans:",len([item for sublist in df.item_price for item in sublist]))

OUTPUT

DF

    item    item_price
0   a       [1, 1.5, 2]
1   b       [0.5, 0.75, 1]

Ans:6
0 голосов
/ 09 сентября 2018

Использование sum и map:

sum(map(len, df.keywords))

Sample

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

sum(map(len, df.keywords))

12

Задержка

df = pd.concat([df]*10000)

%timeit sum(map(len, df.keywords))
1.87 ms ± 52.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.keywords.map(len).sum()
13.5 ms ± 661 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit df.keywords.str.len().sum()
14.3 ms ± 272 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Проверка

>>> sum(map(len, df.keywords)) == df.keywords.map(len).sum() == df.keywords.str.len().sum()
True

Небольшая оговорка: использование pandas методов для столбцов, содержащих списки, всегда будет неэффективным (вот почему использование не-pandas-методов здесь намного быстрее), поскольку DataFrames не предназначены для хранения list. По возможности старайтесь избегать этого.

0 голосов
/ 09 сентября 2018

Я хочу суммировать общее количество элементов списка в ключевых словах столбца

Это отличается от того, что вы псевдокодированы. Я считаю, что вы хотите вызвать функцию size для фреймов данных:

total_sum = keywords.size
0 голосов
/ 09 сентября 2018

IIUC

Настройка

df = pd.DataFrame()
df['keywords']=[['loans','mercedez','bugatti'], 
                ['trump','usa'], 
                ['galaxy','7s','canon','macbook'], 
                ['beiber','spiderman','marvels','ironmen']]

Тогда просто используйте str.len и sum

df.keywords.str.len().sum()

Деталь:

df.keywords.str.len()

0    3
1    2
2    4
3    4
Name: keywords, dtype: int64

Ps: если у вас есть strings, который выглядит как список, используйте ast.literal_eval, чтобы сначала преобразовать в список.

df.keywords.transform(ast.literal_eval).str.len().sum()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...