分割成乙個包含兩個元素列表的列
對於乙個已知分隔符的簡單分割(例如,用破折號分割或用空格分割).str.split() 方法就足夠了 。 它在字串的列(系列)上執行,並返回列表(系列)。
>>> import pandas as pd
>>> df = pd.dataframe()
>>> df
ab0 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 a1 a
name: ab, dtype: object
>>> df['ab'].str[1]
0 11 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'])
結果如下:
name
phone-number
city
state
hannah richard
810-859-7815
irwinville
louisiana
ronald berry
591-564-0585
glen ellen
minnesota
caitlin barron
969-840-8580
dubois
oklahoma
felicia stephens
154-858-1233
veedersburg
alaska
shelly dennis
343-104-9365
mattapex
virginia
nicholas hill
992-239-1954
moneta
minnesota
steve bradshaw
164-081-7811
ten broeck
colorado
gail johnston
155-259-9514
wayan
virginia
john gray
409-892-4716
darlington
pennsylvania
katherine bautista
185-861-1677
mcnab
texas
假如現在我們要對city列進行進行拆分,按照空格拆分,轉換成多行的資料,
第一步:拆分,生成多列
info_city = info['city'].str.split(' ', expand=true)
結果如下:
irwinville
none
glen
ellen
dubois
none
veedersburg
none
mattapex
none
moneta
none
tenbroeck
wayan
none
darlington
none
mcnab
none
可以看到已經將原始資料拆分成了2列,對於無法拆分的資料為none
第二步:行轉列
info_city = info_city.stack()
結果如下:
irwinville
glen
ellen
dubois
veedersburg
mattapex
moneta
tenbroeck
wayan
darlington
mcnab
其中前面兩列是索引,返回的是乙個series,沒有名字的series
第三步:重置索引,並命名(並刪除多於的索引)
info_city = info_city.reset_index(level=1, drop=true)
結果如下:
irwinville
glen
ellen
dubois
veedersburg
mattapex
moneta
tenbroeck
wayan
darlington
mcnab
第四步:和原始資料合併
info_new = info.drop(['city'], axis=1).join(info_city)
結果如下:
name
phone-number
state
city
hannah richard
810-859-7815
louisiana
irwinville
ronald berry
591-564-0585
minnesota
glen
ronald berry
591-564-0585
minnesota
ellen
caitlin barron
969-840-8580
oklahoma
dubois
felicia stephens
154-858-1233
alaska
veedersburg
shelly dennis
343-104-9365
virginia
mattapex
nicholas hill
992-239-1954
minnesota
moneta
steve bradshaw
164-081-7811
colorado
tensteve bradshaw
164-081-7811
colorado
broeck
gail johnston
155-259-9514
virginia
wayan
john gray
409-892-4716
pennsylvania
darlington
katherine bautista
185-861-1677
texas
mcnab
需要特別注意的是,需要使用原始的連線新生成的,因為新生成的是乙個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'))
在python中輸出 在輸出中列印Python版本
如何從指令碼中列印當前python安裝的版本號?嘗試import sys print sys.version 這將列印完整的版本資訊字串。如果您只想要python版本號,那麼bastien l onard的解決方案是最好的。您可能想檢查完整的字串,看看是否需要它或它的一部分。import platf...
7 63 分兩列 5分
一列縱隊在上課的時候會造成很大的麻煩,體育老師常用的辦法就是讓同學們1 2報數,然後報2的同學向後退一步。現在我們已經知道一列縱隊時候同學的學號分布,那麼你能輸出分成兩列後同學的學號麼?第一行包括乙個數n,表示班級裡有n位學生,班級人數至少是1,不超過100。第二行包括n個數,表示一列縱隊時每個同學...
python交換資料的兩列
python交換資料的兩列有兩種方式 第一種 在numpy中交換資料的兩列 上 1 import numpy as np 2 a np.array 1,2,3 4,5,6 3 a 4 array 1,2,3 5 4,5,6 6 a 0,1 a 1,0 7 a 8 array 3,2,1 9 6,5,...