【问题标题】:Get last "column" after .str.split() operation on column in pandas DataFrame在对 pandas DataFrame 中的列进行 .str.split() 操作后获取最后一个“列”
【发布时间】:2014-08-04 12:29:39
【问题描述】:

我在 Pandas DataFrame 中有一个列,我想将其拆分为一个空格。使用DataFrame.str.split(' ') 进行拆分很简单,但我无法从最后一个条目创建新列。当我 .str.split() 列时,我得到一个数组列表,但我不知道如何操作它来为我的 DataFrame 获取一个新列。

这是一个例子。列中的每个条目都包含“符号数据价格”,我想拆分价格(最终在一半的情况下删除“p”...或“c”)。

import pandas as pd
temp = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']})
temp2 = temp.ticker.str.split(' ')

产生

0    ['spx', '5/25/2001', 'p500']
1    ['spx', '5/25/2001', 'p600']
2    ['spx', '5/25/2001', 'p700']

但是temp2[0] 只给出了一个列表条目的数组,而temp2[:][-1] 失败了。如何将每个数组中的最后一个条目转换为新列?谢谢!

【问题讨论】:

    标签: python string pandas split


    【解决方案1】:

    您可以使用tolist 方法作为中介:

    In [99]: import pandas as pd
    
    In [100]: d1 = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']})
    
    In [101]: d1.ticker.str.split().tolist()
    Out[101]: 
    [['spx', '5/25/2001', 'p500'],
     ['spx', '5/25/2001', 'p600'],
     ['spx', '5/25/2001', 'p700']]
    

    您可以从中创建一个新的 DataFrame:

    In [102]: d2 = pd.DataFrame(d1.ticker.str.split().tolist(), 
       .....:                   columns="symbol date price".split())
    
    In [103]: d2
    Out[103]: 
      symbol       date price
    0    spx  5/25/2001  p500
    1    spx  5/25/2001  p600
    2    spx  5/25/2001  p700
    

    为了更好的衡量标准,您可以确定价格:

    In [104]: d2["price"] = d2["price"].str.replace("p","").astype(float)
    
    In [105]: d2
    Out[105]: 
      symbol       date  price
    0    spx  5/25/2001    500
    1    spx  5/25/2001    600
    2    spx  5/25/2001    700
    

    PS:但如果你真的只想要最后一列,apply 就足够了:

    In [113]: temp2.apply(lambda x: x[2])
    Out[113]: 
    0    p500
    1    p600
    2    p700
    Name: ticker
    

    【讨论】:

    • 这只是帮助我在 pandas 中添加了一个日志文件,这在以前太可怕和混乱了(单列数据,每行有很多信息)。
    • 与 Wes McKinney 的答案相比,所有这些方法都具有灾难性的性能。
    • @JohnZwinck:哇,对一个关于功能的五年老答案的只与性能相关的反对票,该答案只介绍了关于 two months before 的功能?那是..严谨,我给你!
    • 但这就是 SE 的重点:过时的答案应该不那么显眼。如果 OP 不更改已接受的解决方案,这在此处是不可能的,因此只有对未来用户的警告可能是投票的差异..
    【解决方案2】:

    这样做:

    In [43]: temp2.str[-1]
    Out[43]: 
    0    p500
    1    p600
    2    p700
    Name: ticker
    

    这样一来就是:

    >>> temp = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']})
    >>> temp['ticker'].str.split(' ').str[-1]
    0    p500
    1    p600
    2    p700
    Name: ticker, dtype: object
    

    【讨论】:

    • 喜欢干净的解决方案!
    • 来自“熊猫”的作者:)
    • 我喜欢这个解决方案,但它是如何工作的?意思是,允许str 后跟括号从列表中选择特定元素的“幕后”发生了什么?
    • 我对此有点困惑,单行是 d1.ticker.str.split().str[-1]。不是你所期望的......
    • @KevinMarkham:它是这样工作的:str 不仅适用于字符串,而且在某种程度上也适用于列表。因此,如果您有一个字符串 Series foo,那么 foo.str[0] 将采用每个字符串的第一个字符,foo.str[-1] 将采用最后一个字符。但由于str 也(部分)在列表上工作,temp2.str[-1] 采用系列中每个列表的最后一个元素。字符串毕竟是一个字符序列,类似于列表。
    【解决方案3】:

    https://pandas.pydata.org/pandas-docs/stable/text.html

    s2 = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'])
    s2.str.split('_').str.get(1)
    

    s2.str.split('_').str[1]
    

    【讨论】:

    • 您可以使用 -1 来获取最后一个元素,例如访问列表中的最后一个元素s2.str.split('_').str.get(-1)
    【解决方案4】:

    使用 Pandas 0.20.3:

    In [10]: import pandas as pd
        ...: temp = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']})
        ...:
    
    In [11]: temp2 = temp.ticker.str.split(' ', expand=True)  # the expand=True return a DataFrame
    
    In [12]: temp2
    Out[12]:
         0          1     2
    0  spx  5/25/2001  p500
    1  spx  5/25/2001  p600
    2  spx  5/25/2001  p700
    
    In [13]: temp3 = temp.join(temp2[2])
    
    In [14]: temp3
    Out[14]:
                   ticker     2
    0  spx 5/25/2001 p500  p500
    1  spx 5/25/2001 p600  p600
    2  spx 5/25/2001 p700  p700
    

    【讨论】:

      【解决方案5】:

      如果您正在寻找单线(就像我来这里一样),这应该很好:

      temp2 = temp.ticker.str.split(' ', expand = True)[-1]
      

      您还可以简单地修改此答案,以将此列分配回原始 DataFrame,如下所示:

      temp['last_split'] = temp.ticker.str.split(' ', expand = True)[-1]
      

      我想这是一个流行的用例。

      【讨论】:

        猜你喜欢
        • 2012-09-12
        • 2018-07-28
        • 1970-01-01
        • 2019-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-17
        相关资源
        最近更新 更多