![](/img/trans.png)
[英]Creating a new data frame column, by splitting a string in another column in pandas
[英]slicing string in pandas data frame and assign a new column
嗨,我有以下数据框:
df = pd.DataFrame()
df['Name'] = ['P. John','Merry','P. John travis']
df['First_Name'] = df.Name.str.split('.', expand = True)[0]
df['Last_Name'] = df.Name.str.split('.', expand = True)[1]
我想根据时间段“”对列进行切片。 并用作姓氏。 除了“ merry”,我可以做所有的事情,它显示None如下:
0 John
1 None
2 John travis
我怎么能在姓氏都没有用名字取代? 在论坛中搜索了A,但找不到。
第二个问题是我还有另一个数据框,如下所示:
df1 = pd.DataFrame({'Name':['John','Merry','John travis'],"Position":['CEO','CTO','Engr']})
我正在使用地图功能为df创建一个新的列** Position **。
df ['Position'] = df.Last_Name.map (df1.set_index('Name').Position)
我在这篇文章中显示的数据框架复制了我正在解决的实际问题。 但是,在实际问题中使用地图功能会给我以下错误代码:
重新索引仅对具有唯一值的Index对象有效。
有人可以建议我吗?
谢谢。
您可以使用参数n=1
进行一次split
来简化代码,以便首先进行拆分.
如果可能的话,将其fillna
1,然后用fillna
替换None
:
df = pd.DataFrame({'Name':['P. John','Merry','P. John travis']})
df[['First_Name', 'Last_Name']] = df.Name.str.split('.\s+', expand = True, n=1)
#if always only one .
#df[['First_Name', 'Last_Name']] = df.Name.str.split('.\s+', expand = True, n=1)
df['Last_Name'] = df['Last_Name'].fillna(df['First_Name'])
print (df)
Name First_Name Last_Name
0 P. John P John
1 Merry Merry Merry
2 P. John travis P John travis
或删除Series of list
的Series of list
expand=True
,然后选择第一个和最后一个值:
splitted = df.Name.str.split('.\s+', n=1)
df['first_Name'] = splitted.str[0]
df['Last_Name'] = splitted.str[-1]
print (df)
Name first_Name Last_Name
0 P. John P John
1 Merry Merry Merry
2 P. John travis P John travis
使用fillna
例如:
import pandas as pd
df = pd.DataFrame()
df['Name'] = ['P. John','Merry','P. John travis']
df['First_Name'] = df.Name.str.split('.', expand = True)[0]
df['Last_Name'] = (df.Name.str.split('.', expand = True)[1]).fillna(df["First_Name"])
print(df)
输出:
Name First_Name Last_Name
0 P. John P John
1 Merry Merry Merry
2 P. John travis P John travis
您可以使用列表理解和否定索引
df['Last_Name'] = [x.split('.')[-1] for x in df.Name]
Name Last_Name
0 P. John John
1 Merry Merry
2 P. John travis John travis
这是上述技术的扩展,可在单个语句中返回一个新的数据帧,并根据需要拆分名称
pd.DataFrame([(lambda x: (y, x[0], x[-1]))(y.split('.'))
for y in df.Name],
columns=['Name', 'First_Name', 'Last_Name'])
Name First_Name Last_Name
0 P. John P John
1 Merry Merry Merry
2 P. John travis P John travis
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.