熊猫数据框列上的子字符串
Posted
技术标签:
【中文标题】熊猫数据框列上的子字符串【英文标题】:Substring on pandas dataframe column 【发布时间】:2018-04-26 18:12:17 【问题描述】:我想从 pandas 数据框中的列 (Name) 中提取子字符串 (Titles - Mr. Mrs, Miss 等),然后将新列 (Title) 写回数据框中。
在数据框的名称列中,我有一个名称,例如“Brand, Mr. Owen Harris”。两个分隔符是 , 和 。
我尝试使用拆分方法,但这只会将列表中的原始字符串一分为二。所以我仍然在列表中发送['Braund','Mr. Owen Harris']。
import pandas as pd
#import re
df_Train = pd.read_csv('https://docs.google.com/spreadsheets/d/e/2PACX-1vTliZmavBsJCFDiEwxcSIIftu-0gR9p34n8Bq4OUNL4TxwHY-JMS6KhZEbWr1bp91UqHPkliZBBFgwh/pub?gid=1593012114&single=true&output=csv')
a= df_Train['Name'].str.split(',')
for i in a:
print(i[1])
我认为这可能是正则表达式发挥作用的情况。我的阅读表明 Lookahead (?=,) 和 Lookbehind (?
import re
a= df_Train['Name'].str.split(r'(?=,)*(?<='.'))
for i in a:
print(i)
print(i[1])`
但我遇到了错误(扫描字符串文字时 EOL)。有人可以指出我正确的方向吗?
干杯 迈克
【问题讨论】:
【参考方案1】:你这样做。
df_Train.Name.str.split(',').str[1].str.split('.').str[0].str.strip()
输出头(5):
0 Mr
1 Mrs
2 Miss
3 Mrs
4 Mr
结果汇总
df_Train.Name.str.split(',').str[1].str.split('.').str[0].str.strip()\
.value_counts()
输出
Mr 517
Miss 182
Mrs 125
Master 40
Dr 7
Rev 6
Mlle 2
Col 2
Major 2
Lady 1
Mme 1
Sir 1
Ms 1
the Countess 1
Jonkheer 1
Don 1
Capt 1
Name: Name, dtype: int64
【讨论】:
你在这个例子中使用了什么数据集? 好的,太好了。我不知道你可以链接这样的方法。 啊错过了,仅供参考,您可以在结果系列上致电.value_counts()
,而不是.to_frame().groupby('Name')['Name'].count()
我不明白这是如何工作的。 str[1] 部分有什么作用?谁能解释一下?
@deadcode,.str 访问器正在作用于一个列表,而 str[1] 正在检索由 split(',') 创建的列表中的第二个元素。所以在 "Brand, Mr. Owen Harris" 的情况下, split(',') 返回一个包含两个元素的列表 ["Brand", "Mr. Owen Harris"],那么我们使用 str[1] 得到第二个元素 "Mr. Owen Harris" 我们使用 split('.') 将该字符串拆分为 ["Mr", "Owen Harris"[ 然后在列表中再次使用 .str 访问器以获取第一个带有 .str[0] 的元素.【参考方案2】:
错误是因为您在单引号正则表达式字符串文字中的句点周围有单引号;这实际上不是正确的语法,我认为您的意思是使用转义句点,即r'(?=,)*(?<=\.)
。但是,您不需要在这里使用前瞻/后视,使用捕获组来描述您的正则表达式更为常见和简单;在这种情况下,正则表达式将是
df_Train['Name'].str.extract(", (\w*)\.")
【讨论】:
以上是关于熊猫数据框列上的子字符串的主要内容,如果未能解决你的问题,请参考以下文章