代码之家  ›  专栏  ›  技术社区  ›  Richard Herron

获取pandas DataFrame中对列执行.str.split()操作后的最后一个“列”

  •  118
  • Richard Herron  · 技术社区  · 14 年前

    我在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] 失败。如何将每个数组中的最后一个条目转换为新列?谢谢

    5 回复  |  直到 11 年前
        1
  •  228
  •   Erfan    6 年前

    请执行以下操作:

    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
    
        2
  •  47
  •   DSM    14 年前

    你可以使用 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
    

    附言:但如果你 真正地 只需要最后一列, apply 就足够了:

    In [113]: temp2.apply(lambda x: x[2])
    Out[113]: 
    0    p500
    1    p600
    2    p700
    Name: ticker
    
        3
  •  29
  •   James Holland    9 年前

    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]
    
        4
  •  6
  •   AllanLRH    8 年前

    使用熊猫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
  •  5
  •   sfortney    7 年前

    如果你正在寻找一条班轮(就像我来这里的目的一样),这应该做得很好:

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

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

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

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