【问题标题】:count total number of list elements in pandas column计算熊猫列中列表元素的总数
【发布时间】:2019-02-14 06:33:45
【问题描述】:

我有一个熊猫数据框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

我如何在 pandas 中做到这一点?

【问题讨论】:

  • 这对我来说真的不清楚。请给出一个示例 df(在代码中,所以它是预先构建的以节省我们的时间)和预期的输出。
  • @roganjosh 我给出了一个样本 df 为A,其中只有一列为keywords。我只想在keywords 列中添加所有列表元素,并将该值存储在名为total_sum的变量中
  • 介意提供预期的输出吗?
  • @Wen 请检查已编辑的问题。希望你现在明白了 :)

标签: python python-3.x pandas


【解决方案1】:

更像是一个列表展平问题

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      方法一:

      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
      

      【讨论】:

        【解决方案4】:

        你可以试试这个:

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

        【讨论】:

          【解决方案5】:

          我想汇总列关键字中列表元素的总数

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

          total_sum = keywords.size
          

          【讨论】:

            【解决方案6】:

            IIUC

            设置

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

            详情:

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

            【讨论】:

            • 我很困惑,很遗憾无法测试,但为什么str.len() 计算列表中的元素数量?这似乎违反直觉
            • 我将不得不跟进 :) 将此功能作为 str 访问器的一部分让我有点震惊
            • @roganjosh 是的,这确实不直观。但是str.len 的工作方式会有所不同,具体取决于该单元格中的对象类型。它具有不同的功能,具体取决于它是字典、列表、字符串还是np, nan :) 在源代码(和文档字符串)中,您可以看到str.len 的示例(str.len)与字典、元组一起使用、列表、整数和 nans。
            • 我很欣赏这篇文章,虽然它很简单,但它帮助我解决了我被困一段时间的事情!再次感谢!
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-07-13
            • 2023-01-19
            • 1970-01-01
            • 2020-07-24
            • 1970-01-01
            • 2020-10-29
            相关资源
            最近更新 更多