在 pandas DataFrame 中的列上执行 .str.split() 操作后获取最后一个“列”
- 2025-03-19 08:57:00
- admin 原创
- 7
问题描述:
我想在 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]
失败。我怎样才能将每个数组中的最后一项转换为新列?谢谢!
解决方案 1:
这样做:
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:
您可以使用该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
解决方案 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]
解决方案 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]
我想这是一个常见的用例。
解决方案 6:
import pandas as pd
temp = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']})
temp["last"] = temp.ticker.str.split(" ").apply(lambda x: x[-1])
# ticker last
# 0 spx 5/25/2001 p500 p500
# 1 spx 5/25/2001 p600 p600
# 2 spx 5/25/2001 p700 p700
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD