如何根据不同的值对一个 Pandas 数据框列的元素进行切片?
How can I slice elements of one Pandas dataframe column by different values?
我有一个“脏”csv 文件加载到 Pandas 数据框中。一列“姓名”有时会带有前缀(例如实际姓名前的“(3.)”)。
我了解此前缀的分类法并知道如何查找索引,从中我想保留字符串的其余部分:
df["Indexes"]= df["Name"].str.find(')')
但是:如何将 evertying 减少到该索引?
例如,如果“姓名”是“(3.) Peter”,我希望它变成“Peter”。
假设我想使用 slice。我的问题是我需要切片的值每行都不同。 -- 如果前缀的长度始终为 4,下面的代码将起作用,但事实并非如此(有时没有前缀,有时长度为 5)。
pd.Series(df["Name"]).str.slice(4)
我该怎么做?
如果你知道模式,你可以使用extract
来获得干净的名字:
# The "dirty" CSV
string = """
(3.) Peter
(10.) David
Jane
(100.) Mary Wether
"""
df = pd.read_csv(StringIO(string), header=None, names=['Name'])
# Clean it
df['CleanName'] = df['Name'].str.extract(r'(\(.*\) )?(?P<Name>.+?)( \(.*\))?')['Name']
结果:
Name CleanName
0 (3.) Peter Peter
1 (10.) David David
2 Jane Jane
3 (100.) Mary Wether Mary Wether
前往 Regex 101 了解正则表达式模式的解释。
我有一个“脏”csv 文件加载到 Pandas 数据框中。一列“姓名”有时会带有前缀(例如实际姓名前的“(3.)”)。
我了解此前缀的分类法并知道如何查找索引,从中我想保留字符串的其余部分:
df["Indexes"]= df["Name"].str.find(')')
但是:如何将 evertying 减少到该索引?
例如,如果“姓名”是“(3.) Peter”,我希望它变成“Peter”。
假设我想使用 slice。我的问题是我需要切片的值每行都不同。 -- 如果前缀的长度始终为 4,下面的代码将起作用,但事实并非如此(有时没有前缀,有时长度为 5)。
pd.Series(df["Name"]).str.slice(4)
我该怎么做?
如果你知道模式,你可以使用extract
来获得干净的名字:
# The "dirty" CSV
string = """
(3.) Peter
(10.) David
Jane
(100.) Mary Wether
"""
df = pd.read_csv(StringIO(string), header=None, names=['Name'])
# Clean it
df['CleanName'] = df['Name'].str.extract(r'(\(.*\) )?(?P<Name>.+?)( \(.*\))?')['Name']
结果:
Name CleanName
0 (3.) Peter Peter
1 (10.) David David
2 Jane Jane
3 (100.) Mary Wether Mary Wether
前往 Regex 101 了解正则表达式模式的解释。