Pandas: 如何將一列中的文本拆分為多行?
在數據處理過程中,經常會遇到以下類型的數據:
在同一列中,本該分別填入多行中的數據,被填在一行里了,然而在分析的時候,需要拆分成為多行。
在上圖中,列名為"Country" ,index為4和5的單元格內,值為"UK/Australia"和"UK/Netherland"。
今天,我們來介紹將含有多值的內容分拆成多行的幾種方法。
載入數據
PS:可以通過左右滑動來查看代碼
df = pd.DataFrame({Country:[China,US,Japan,EU,UK/Australia, UK/Netherland],n Number:[100, 150, 120, 90, 30, 2],n Value: [1, 2, 3, 4, 5, 6],n label: list(abcdef)})ndfnnOut[2]:n Country Number Value labeln0 China 100 1 an1 US 150 2 bn2 Japan 120 3 cn3 EU 90 4 dn4 UK/Australia 30 5 en5 UK/Netherland 2 6 fn
1 Method-1
分為如下幾步:
- 將含有多值的列進行拆分,然後通過 stack()方法進行變換,並通過index的設置來完成
- 用 drop()方法從DataFrame中刪除含有多值的列
- 然後用 join()方法來合併
df.drop(Country, axis=1).join(df[Country].str.split(/, expand=True).stack().reset_index(level=1, drop=True).rename(Country))nOut[3]:n Number Value label Countryn0 100 1 a Chinan1 150 2 b USn2 120 3 c Japann3 90 4 d EUn4 30 5 e UKn4 30 5 e Australian5 2 6 f UKn5 2 6 f Netherlandn
過程分步介紹
df[Country].str.split(/, expand=True).stack()nOut[4]:n0 0 Chinan1 0 USn2 0 Japann3 0 EUn4 0 UKn 1 Australian5 0 UKn 1 Netherlandndtype: objectnndf[Country].str.split(/, expand=True).stack().reset_index(level=1, drop=True)nOut[5]:n0 Chinan1 USn2 Japann3 EUn4 UKn4 Australian5 UKn5 Netherlandndtype: objectnndf[Country].str.split(/, expand=True).stack().reset_index(level=1, drop=True).rename(Country)nOut[6]:n0 Chinan1 USn2 Japann3 EUn4 UKn4 Australian5 UKn5 NetherlandnName: Country, dtype: objectnndf.drop(Country, axis=1)nOut[7]:n Number Value labeln0 100 1 an1 150 2 bn2 120 3 cn3 90 4 dn4 30 5 en5 2 6 fn
2 Method-2
該方法的思路跟Method-1基本是一樣的,只是在具體的細節方面有些差異。代碼如下:
df[Country].str.split(/, expand=True).stack().reset_index(level=0).set_index(level_0).rename(columns={0:Country}).join(df.drop(Country, axis=1))nOut[8]:n Country Number Value labeln0 China 100 1 an1 US 150 2 bn2 Japan 120 3 cn3 EU 90 4 dn4 UK 30 5 en4 Australia 30 5 en5 UK 2 6 fn5 Netherland 2 6 fn
過程分步介紹如下:
df[Country].str.split(/, expand=True).stack().reset_index(level=0)nOut[9]:n level_0 0n0 0 Chinan0 1 USn0 2 Japann0 3 EUn0 4 UKn1 4 Australian0 5 UKn1 5 Netherlandnndf[Country].str.split(/, expand=True).stack().reset_index(level=0).set_index(level_0)nOut[10]:n 0nlevel_0 n0 Chinan1 USn2 Japann3 EUn4 UKn4 Australian5 UKn5 Netherlandnndf[Country].str.split(/, expand=True).stack().reset_index(level=0).set_index(level_0).rename(columns={0:Country})nOut[11]:n Countrynlevel_0 n0 Chinan1 USn2 Japann3 EUn4 UKn4 Australian5 UKn5 Netherlandnndf.drop(Country, axis=1)nOut[12]:n Number Value labeln0 100 1 an1 150 2 bn2 120 3 cn3 90 4 dn4 30 5 en5 2 6 fn
3 閑談
當然,將某列中含有多值的單元拆分成多行,還有其他方法,各位小夥伴們可以研究下~~
如果您喜歡我的文章,歡迎關注微信公眾號(ID:PyDataRoad)
推薦閱讀:
※淺談C5.0與CART演算法的比較--理論理解
※從小白到演算法工程師,這是我的學習求職之路
※知乎中的「近義詞」(三):讓搜索更智能
※挖掘數據價值,從用戶分群開始
※沒人帶的數據分析師能做嗎?