在Pandas列中统计列表元素的总数

14

我有一个名为A的pandas数据帧,其中列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

我该如何在 Pandas 中实现它?


这对我来说真的不清楚。请提供一个示例 df(用代码编写,以节省时间),并提供预期输出。 - roganjosh
@roganjosh 我已经提供了一个名为A的示例df,其中只有一个名为keywords的列。我想要将keywords列中的所有列表元素相加,并将该值存储在名为total_sum的变量中。 - Learner
能否提供预期输出? - BENY
@Wen,请检查已编辑的问题。希望现在你明白了 :) - Learner
7个回答

16

IIUC

Setup

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

那么就使用 str.lensum
df.keywords.str.len().sum()

Detail:

df.keywords.str.len()

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

提示:如果你有看起来像列表的字符串,使用 ast.literal_eval 将其先转换为列表。

df.keywords.transform(ast.literal_eval).str.len().sum()

我很困惑,但很遗憾无法测试,为什么 str.len() 计算列表中元素的数量?这似乎与直觉相反。 - roganjosh
2
我得跟进一下 :) 将此功能作为 str 访问器的一部分拥有让我有些惊讶。 - roganjosh
1
@roganjosh 是的,它确实不直观。但是 str.len 的工作方式取决于该单元格中的对象类型。它具有不同的功能,具体取决于它是字典、列表、字符串还是 np, nan :) 在源代码(和文档字符串)中,您可以看到一个示例(在此处)展示了 str.len 如何与字典、元组、列表、整数和 nans 一起使用。 - rafaelc
1
我很感激这篇文章,虽然它很简单,但它帮助我解决了一段时间以来困扰我的问题!再次感谢! - Matt_Davis

7

使用summap

sum(map(len, df.keywords))

样例

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方法要快得多),因为数据框不适合存储列表。您应该尽可能避免这种情况。

5
你可以尝试这个:
df.keywords.map(len).sum()

2

就这么简单。

也许自那时以来Pandas已经发展了。

df['len_of_list'] = df.my_columns_with_list.agg([len])

Cheers,


这是唯一一个正确计算物品数量的解决方案。数据格式如rafaelc所描述。 - Simone

0
我想要对列关键词中的所有列表元素求和。
这与您伪代码中的内容不同。我相信你想调用数据框的size函数:
total_sum = keywords.size

0

方法一:

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

方法二:

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]))

输出

df

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

Ans:6

0
更像是一个列表扁平化的问题。
import itertools
len(list(itertools.chain(*df.keywords.values.tolist())))
Out[57]: 13

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接