【问题标题】:Pandas count frequencies within str series熊猫计算 str 系列中的频率
【发布时间】:2016-09-17 02:08:10
【问题描述】:

给定一个 str 类型的 Pandas 系列,我想获取 str.split 返回的结果的频率。

例如,给定系列

s = pd.Series(['abc,def,ghi','ghi,abc'])

我想得到

abc: 2
def: 1
ghi: 2

结果。我怎样才能得到这个?

编辑:该解决方案应该有效地处理包含 5000 万行的大型 Series。

【问题讨论】:

    标签: python string pandas dataframe


    【解决方案1】:

    str.splitsumvalue_counts 的另一个 pandas 解决方案:

    print pd.Series(s.str.split(',').sum()).value_counts()
    abc    2
    ghi    2
    def    1
    dtype: int64
    

    编辑:

    更有效的方法:

    import pandas as pd
    s = pd.Series(['abc,def,ghi','ghi,abc'])
    s = pd.concat([s]*10000).reset_index(drop=True)
    
    In [17]: %timeit pd.Series(s.str.split(',').sum()).value_counts()
    1 loops, best of 3: 3.1 s per loop
    
    In [18]: %timeit s.str.split(',', expand=True).stack().value_counts()
    10 loops, best of 3: 46.2 ms per loop
    
    In [19]: %timeit pd.DataFrame([ x.split(',') for x in s.tolist() ]).stack().value_counts()
    10 loops, best of 3: 22.2 ms per loop
    
    In [20]: %timeit pd.Series([item for sublist in [ x.split(',') for x in s.tolist() ] for item in sublist]).value_counts()
    100 loops, best of 3: 16.6 ms per loop
    

    【讨论】:

    • pd.Series(s.str.split(',').sum()).value_counts() - 这个不错!
    • 谢谢,MaxU。美好的一天。
    • 在 5000 万行的大型数据帧上,对 sum() 的调用似乎真的很慢。有没有其他选择?
    【解决方案2】:

    这就是你想要的吗?

    In [29]: from collections import Counter
    
    In [30]: Counter(s.str.split(',').sum())
    Out[30]: Counter({'abc': 2, 'def': 1, 'ghi': 2})
    

    In [34]: a = pd.Series(s.str.split(',').sum())
    
    In [35]: a
    Out[35]:
    0    abc
    1    def
    2    ghi
    3    ghi
    4    abc
    dtype: object
    
    In [36]: a.groupby(a).size()
    Out[36]:
    abc    2
    def    1
    ghi    2
    dtype: int64
    

    【讨论】:

    • 你是个天才!非常感谢!这个问题我想了很久!
    • @David,总是乐于助人! :)
    • 其实,这似乎比最初想象的要难。我正在处理一个大约有 5000 万行的大型系列。但是,对sum() 的调用似乎真的很慢。有没有其他选择?
    • @David,嗯... 50M 行需要多长时间?
    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 2017-08-11
    • 2018-03-28
    • 2018-09-04
    • 2015-03-05
    • 2018-07-24
    • 2019-05-26
    • 2014-02-05
    相关资源
    最近更新 更多