在pandas数据框中切片字符串并分配一个新列

时间:2018-08-02 08:36:56

标签: python string pandas

嗨,我有以下数据框:

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”,我可以做所有事情,它显示,如下:

0            John
1            None
2     John travis

如何用名字替换姓氏中的所有? 在论坛中进行了搜索,找不到一个。

第二个问题是我还有另一个数据框,如下所示:

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)

但是df中的新列显示了一些Nan值,如下所示: enter image description here

我在本文中显示的数据框复制了我正在解决的实际问题。 但是,在实际问题中使用地图功能会给我以下错误代码:

  

重新索引仅对具有唯一值的Index对象有效。

有人可以建议我吗?

谢谢。

3 个答案:

答案 0 :(得分:2)

您可以使用参数'depends': [ 'sale_stock', ... ], 将代码split简化为一个n=1,如果可能的话可以先分割.,然后将None替换为fillna

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

或删除expand=True的{​​{1}},然后选择第一个和最后一个值:

Series of list

答案 1 :(得分:1)

使用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

答案 2 :(得分:1)

您可以使用列表理解和否定索引

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