簡體   English   中英

在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)

但是df中的新列向我顯示了一些Nan值,如下所示: 在此處輸入圖片說明

我在這篇文章中顯示的數據框架復制了我正在解決的實際問題。 但是,在實際問題中使用地圖功能會給我以下錯誤代碼:

重新索引僅對具有唯一值的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 listSeries 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM