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

分為如下幾步:

  1. 將含有多值的列進行拆分,然後通過 stack()方法進行變換,並通過index的設置來完成
  2. 用 drop()方法從DataFrame中刪除含有多值的列
  3. 然後用 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演算法的比較--理論理解
從小白到演算法工程師,這是我的學習求職之路
知乎中的「近義詞」(三):讓搜索更智能
挖掘數據價值,從用戶分群開始
沒人帶的數據分析師能做嗎?

TAG:Python | 数据挖掘 | 数据分析 |