【问题标题】:Extract first characters from list series pandas从列表系列熊猫中提取第一个字符
【发布时间】:2016-10-22 11:43:46
【问题描述】:

我有一个包含多个单词的字符串系列。我想以矢量化方式提取每行每个单词的第一个字符。

到目前为止,我已经能够将单词拆分成一个列表,但还没有找到获取第一个字符的矢量化方法。

s = pd.Series(['aa bb cc', 'cc dd ee', 'ff ga', '0w'])

>>> s. str.split()
0    [aa, bb, cc]
1    [cc, dd, ee]
2        [ff, ga]
3            [0w]

最终,我想要这样的东西:

0    [a, b, c]
1    [c, d, e]
2       [f, g]
3          [0]

【问题讨论】:

    标签: python string pandas dataframe character


    【解决方案1】:

    另一个更快的解决方案是嵌套列表理解:

    s2 = pd.Series([[y[0] for y in x.split()] for x in s.tolist()])
    print (s2)
    0    [a, b, c]
    1    [c, d, e]
    2       [f, g]
    3          [0]
    dtype: object
    

    感谢clocker 的改进-您可以删除tolist()

    print (pd.Series([[y[0] for y in x.split()] for x in s]))
    

    时间安排

    import pandas as pd
    
    s = pd.Series(['aa bb cc', 'cc dd ee', 'ff ga', '0w'])
    s = pd.concat([s]*10000).reset_index(drop=True)
    print(s)
    
    In [42]: %timeit pd.Series([[y[0] for y in x.split()] for x in s.tolist()])
    10 loops, best of 3: 28.6 ms per loop
    
    In [43]: %timeit (s.str.split().map(lambda lst : [string[0] for string  in lst]))
    10 loops, best of 3: 50.4 ms per loop
    
    In [44]: %timeit (s.str.split().apply(lambda lst: [list(elt)[0] for elt in lst]))
    10 loops, best of 3: 76.1 ms per loop
    
    In [59]: %timeit (pd.Series([[y[0] for y in x.split()] for x in s]))
    10 loops, best of 3: 28.8 ms per loop
    

    【讨论】:

    • 感谢您考虑效率。
    • 来自“jezrael”的答案很好。只是想为列表理解添加它,迭代诸如 Series 之类的序列不需要 .tolist() 方法。少量数据的次要点,但可以加起来用于大型系列。 pd.Series([[y[0] for y in x.split()] for x in s]) 可以正常工作。
    【解决方案2】:

    一种直接的方法是使用pandas.Series.map 方法:

    In [15]: s.str.split().map(lambda lst : [string[0] for string  in lst])
    Out[15]: 
    0    [a, b, c]
    1    [c, d, e]
    2       [f, g]
    3          [0]
    dtype: object
    

    【讨论】:

    • 谢谢。没有考虑使用地图。认为我会更广泛地将它用于这些类型的操作。
    【解决方案3】:

    你可以试试这个:

    >>> s2 = s.str.split()
    >>> s2.apply(lambda lst: [list(elt)[0] for elt in lst])
    0    [a, b, c]
    1    [c, d, e]
    2       [f, g]
    3          [0]
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 2020-12-27
      • 2019-02-22
      • 2021-10-22
      • 1970-01-01
      • 2018-12-07
      • 1970-01-01
      相关资源
      最近更新 更多