您好,登錄后才能下訂單哦!
這篇“Pandas怎么使用分隔符或正則表達式將字符串拆分為多列”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Pandas怎么使用分隔符或正則表達式將字符串拆分為多列”文章吧。
字符串方法是pandas.Series方法。
適用于pandas.Series或pandas.DataFrame列
要按定界符(delimiter)進行拆分,使用字符串方法str.split()。
以以下pandas.Series為例。
import pandas as pd s_org = pd.Series(['aaa@xxx.com', 'bbb@yyy.com', 'ccc@zzz.com', 'ddd'], index=['A', 'B', 'C', 'D']) print(s_org) print(type(s_org)) # A aaa@xxx.com # B bbb@yyy.com # C ccc@zzz.com # D ddd # dtype: object # <class 'pandas.core.series.Series'>
將定界符指定為第一個參數。一個pandas.Series元素作為拆分字符串的列表返回。
s = s_org.str.split('@') print(s) print(type(s)) # A [aaa, xxx.com] # B [bbb, yyy.com] # C [ccc, zzz.com] # D [ddd] # dtype: object # <class 'pandas.core.series.Series'>
指定split = True作為參數可分為多個列并以pandas.DataFrame的形式獲取。默認值為expand = False。
沒有足夠的行劃分的元素為“無(None)”。
df = s_org.str.split('@', expand=True) print(df) print(type(df)) # 0 1 # A aaa xxx.com # B bbb yyy.com # C ccc zzz.com # D ddd None # <class 'pandas.core.frame.DataFrame'>
可以在列中指定獲取的pandas.DataFrame的列名。
df.columns = ['local', 'domain'] print(df) # local domain # A aaa xxx.com # B bbb yyy.com # C ccc zzz.com # D ddd None
如果要通過將pandas.DataFrame的特定列拆分為多列來更新它,這會有些乏味。可能有更好的方法。
以先前創建的pandas.DataFrame為例。
print(df) # local domain # A aaa xxx.com # B bbb yyy.com # C ccc zzz.com # D ddd None
在特定的列上使用str.split()獲得一個拆分的pandas.DataFrame。
print(df['domain'].str.split('.', expand=True)) # 0 1 # A xxx com # B yyy com # C zzz com # D None None
使用pd.concat()與原始pandas.DataFrame進行串聯(聯接),并使用drop()方法刪除原始列。
df2 = pd.concat([df, df['domain'].str.split('.', expand=True)], axis=1).drop('domain', axis=1) print(df2) # local 0 1 # A aaa xxx com # B bbb yyy com # C ccc zzz com # D ddd None None
如果剩余的列很少,則只能選擇與pd.concat()串聯(聯接)時所需的列。
df3 = pd.concat([df['local'], df['domain'].str.split('.', expand=True)], axis=1) print(df3) # local 0 1 # A aaa xxx com # B bbb yyy com # C ccc zzz com # D ddd None None
要重命名特定的列,請使用rename()方法。
df3.rename(columns={0: 'second_LD', 1: 'TLD'}, inplace=True) print(df3) # local second_LD TLD # A aaa xxx com # B bbb yyy com # C ccc zzz com # D ddd None None
參考文章
Pandas.DataFrame的行名和列名的修改
使用字符串方法str.extract()分割正則表達式。
以以下pandas.Series為例。
import pandas as pd s_org = pd.Series(['aaa@xxx.com', 'bbb@yyy.com', 'ccc@zzz.com', 'ddd'], index=['A', 'B', 'C', 'D']) print(s_org) # A aaa@xxx.com # B bbb@yyy.com # C ccc@zzz.com # D ddd # dtype: object
在第一個參數中指定正則表達式。對于每個與正則表達式中用()括起來的組部分匹配的字符串,均對其進行劃分。
提取多個組時,無論參數expand如何,都將返回pandas.DataFrame。
如果不匹配,則為NaN。
df = s_org.str.extract('(.+)@(.+)\.(.+)', expand=True) print(df) # 0 1 2 # A aaa xxx com # B bbb yyy com # C ccc zzz com # D NaN NaN NaN df = s_org.str.extract('(.+)@(.+)\.(.+)', expand=False) print(df) # 0 1 2 # A aaa xxx com # B bbb yyy com # C ccc zzz com # D NaN NaN NaN
如果只有一組,則當參數expand = True時返回pandas.DataFrame,如果expand = False則返回pandas.Series。
df_single = s_org.str.extract('(\w+)', expand=True) print(df_single) print(type(df_single)) # 0 # A aaa # B bbb # C ccc # D ddd # <class 'pandas.core.frame.DataFrame'> s = s_org.str.extract('(\w+)', expand=False) print(s) print(type(s)) # A aaa # B bbb # C ccc # D ddd # dtype: object # <class 'pandas.core.series.Series'>
Expand = False是當前版本0.22.0中的默認值,但expand = True將是將來的默認值。
FutureWarning: currently extract(expand=None) means expand=False (return Index/Series/DataFrame)
but in a future version of pandas this will be changed to expand=True (return DataFrame)
如果對正則表達式模式使用命名組(?P …),則該名稱將按原樣是列名。
df_name = s_org.str.extract('(?P<local>.*)@(?P<second_LD>.*)\.(?P<TLD>.*)', expand=True) print(df_name) # local second_LD TLD # A aaa xxx com # B bbb yyy com # C ccc zzz com # D NaN NaN NaN
如果要通過將pandas.DataFrame的特定列劃分為多個列來進行更新,請參考上面的str.split()示例。使用pd.concat()連接(聯接)原始的pandas.DataFrame并使用drop()方法刪除原始的列。
以上就是關于“Pandas怎么使用分隔符或正則表達式將字符串拆分為多列”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。