计算pandas列中列表元素的总数

时间:2018-09-09 18:19:06

标签: python python-3.x pandas

我有一个熊猫数据框A,列keywords为 (此处Im仅显示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 :(得分:6)

使用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方法总是效率低下的(这就是为什么在这里使用非熊猫方法要快得多的原因),因为DataFrames并非旨在存储list。您应尽可能避免这种情况。

答案 1 :(得分:4)

IIUC

设置

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

然后juse使用str.lensum

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

答案 2 :(得分:4)

您可以尝试以下一种方法:

df.keywords.map(len).sum()

答案 3 :(得分:0)

  

我想对列关键字中列表元素的总数求和

这与您的伪编码不同。我相信您的意思是为数据帧调用size函数:

total_sum = keywords.size

答案 4 :(得分:0)

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

输出

df

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

Ans:6

答案 5 :(得分:0)

更像是列表变平的问题

import itertools
len(list(itertools.chain(*df.keywords.values.tolist())))
Out[57]: 13