歡迎您光臨本站 註冊首頁

Pandas實現一列資料分隔為兩列

←手機掃碼閱讀     火星人 @ 2020-06-11 , reply:0

分割成一個包含兩個元素列表的列

對於一個已知分隔符的簡單分割(例如,用破折號分割或用空格分割).str.split() 方法就足夠了 。 它在字串的列(系列)上執行,並返回列表(系列)。

  >>> import pandas as pd  >>> df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2']})  >>> df      AB  0 A1-B1  1 A2-B2  >>> df['AB_split'] = df['AB'].str.split('-')  >>> df      AB AB_split  0 A1-B1 [A1, B1]  1 A2-B2 [A2, B2]

 

分割成兩列,每列包含列表的相應元素

下面來看下如何從:分割成一個包含兩個元素列表的列至分割成兩列,每列包含列表的相應元素。

  >>> df['AB'].str[0]    0 A  1 A  Name: AB, dtype: object    >>> df['AB'].str[1]    0 1  1 2  Name: AB, dtype: object

 

因此可以得到

  >>> df['AB'].str.split('-', 1).str[0]    0 A1  1 A2  Name: AB, dtype: object    >>> df['AB'].str.split('-', 1).str[1]    0 B1  1 B2  Name: AB, dtype: object

 

可以透過如下程式碼將pandas的一列分成兩列:
 

  >>> df['A'], df['B'] = df['AB'].str.split('-', 1).str  >>> df      AB AB_split A B  0 A1-B1 [A1, B1] A1 B1  1 A2-B2 [A2, B2] A2 B2

 

補充知識:pandas某一列中每一行拆分成多行的方法

在處理資料過程中,常會遇到將一條資料拆分成多條,比如一個人的地址資訊中,可能有多條地址,既有家庭地址也有工作地址,還有電話資訊等等類似的情況,實際使用資料的時候又需要分開處理,這個時候就需要將這一條資料進行拆分成多條,以方便使用。

在pandas中如何對DataFrame進行相關操作呢,經查閱相關資料,發現了一個簡單的辦法,

info.drop(['city'], axis=1).join(info['city'].str.split(' ', expand=True).stack().reset_index(level=1, drop=True).rename('city'))

看起來非常之長,分開來看,流程如下:

將需要拆分的資料使用split拆分工具拆分,並使用expand功能拆分成多列

將拆分後的多列資料進行列轉行操作(stack),合併成一列

將生成的複合索引重新進行reset保留原始的索引,並命名

將上面處理後的DataFrame和原始DataFrame進行join操作,預設使用的是索引進行連線

具體操作如下:

預操作:生成需要使用的DataFrame

  # 用來生成DataFrame的工具  from pydbgen import pydbgen  myDB=pydbgen.pydb()    # 生成一個DataFrame  info = myDB.gen_dataframe(10,['name','phone','city','state'])

 

結果如下:


namephone-numbercitystate
0Hannah Richard810-859-7815IrwinvilleLouisiana
1Ronald Berry591-564-0585Glen EllenMinnesota
2Caitlin Barron969-840-8580DuboisOklahoma
3Felicia Stephens154-858-1233VeedersburgAlaska
4Shelly Dennis343-104-9365MattapexVirginia
5Nicholas Hill992-239-1954MonetaMinnesota
6Steve Bradshaw164-081-7811Ten BroeckColorado
7Gail Johnston155-259-9514WayanVirginia
8John Gray409-892-4716DarlingtonPennsylvania
9Katherine Bautista185-861-1677McNabTexas

假如現在我們要對city列進行進行拆分,按照空格拆分,轉換成多行的資料,
 第一步:拆分,生成多列

info_city = info['city'].str.split(' ', expand=True)
 

結果如下:


01
0IrwinvilleNone
1GlenEllen
2DuboisNone
3VeedersburgNone
4MattapexNone
5MonetaNone
6TenBroeck
7WayanNone
8DarlingtonNone
9McNabNone

可以看到已經將原始資料拆分成了2列,對於無法拆分的資料為None

第二步:行轉列

info_city = info_city.stack()

結果如下:




00Irwinville
10Glen

1Ellen
20Dubois
30Veedersburg
40Mattapex
50Moneta
60Ten

1Broeck
70Wayan
80Darlington
90McNab

其中前面兩列是索引,返回的是一個series,沒有名字的series

第三步:重置索引,並命名(並刪除多於的索引)

info_city = info_city.reset_index(level=1, drop=True)

結果如下:



0Irwinville
1Glen
1Ellen
2Dubois
3Veedersburg
4Mattapex
5Moneta
6Ten
6Broeck
7Wayan
8Darlington
9McNab

第四步:和原始資料合併

info_new = info.drop(['city'], axis=1).join(info_city)

結果如下:


namephone-numberstatecity
0Hannah Richard810-859-7815LouisianaIrwinville
1Ronald Berry591-564-0585MinnesotaGlen
1Ronald Berry591-564-0585MinnesotaEllen
2Caitlin Barron969-840-8580OklahomaDubois
3Felicia Stephens154-858-1233AlaskaVeedersburg
4Shelly Dennis343-104-9365VirginiaMattapex
5Nicholas Hill992-239-1954MinnesotaMoneta
6Steve Bradshaw164-081-7811ColoradoTen
6Steve Bradshaw164-081-7811ColoradoBroeck
7Gail Johnston155-259-9514VirginiaWayan
8John Gray409-892-4716PennsylvaniaDarlington
9Katherine Bautista185-861-1677TexasMcNab

需要特別注意的是,需要使用原始的連線新生成的,因為新生成的是一個series沒有join方法,也可以透過將生成的series透過to_frame方法轉換成DataFrame,這樣就沒有什麼差異了

寫了這麼多,記住下面的就行了:

info.drop([『city'], axis=1).join(info[『city'].str.split(' ', expand=True).stack().reset_index(level=1, drop=True).rename(『city'))

如果原資料中已經是list了,可以將info[『city'].str.split(' ', expand=True)這部分替換成info[『city'].apply(lambda x: pd.Series(x)),就可以達到相同的目的。

 


[火星人 ] Pandas實現一列資料分隔為兩列已經有261次圍觀

http://coctec.com/docs/python/shhow-post-237991.html