Pandas分割字符串.pdf
importpandas as pd ...##字符串切片 df['身高_num'] = df['身高'].str[0:3] ## 去除 df['身高_num'] = df['身高'].str.strip('cm') df['身高_num'] = df['身高'].str.replace('cm','') print(df.info())
import pandasas pd df= pd.read_excel('成绩表(统计).xls',sheet_name='写入(新)') df= df['性别'].astype(str)## 字符串切片 df['身高_num']= df['身高'].str[0:3]## 去除 df['身高_num']= df['身高'].str.strip('cm') df['身高_num']= df['身高'].str.replace('cm','')print(df.info())## 转换成整数型数据 df= df['身高_num'].astype(int)## 字符串分割(地址) df= df['住址'].str.split(',') df= df['住址'].str.split(',').str[0]## 字符串长度 df= df['住址'].str.len()print(df)
42_Pandas字符串中提取正则表达式来生成新列 如何通过从以字符串为元素的pandas.DataFrame列和pandas.Series中提取带有正则表达式的特定字符串来生成新列。 使用以下字符串方法。 str.extract():仅提取第一个...
42_Pandas字符串中提取正则表达式来生成新列
如何通过从以字符串为元素的pandas.DataFrame列和pandas.Series中提取带有正则表达式的特定字符串来生成新列。
使用以下字符串方法。
str.extract():仅提取第一个匹配项str.extractall():提取所有匹配项
如果要从pandas.DataFrame的列中提取,可以指定列(= pandas.Series),例如df [‘column name’],然后调用str.extract()或str.extractall()确定。
str.extract():仅提取第一个匹配项
以下pandas.Series为例。
import pandasas pd s_org= pd.Series(['aaa@xxx.com','bbb@yyy.net','ccc@zzz.co.jp'], index=['A','B','C'])print(s_org)# A aaa@xxx.com# B bbb@yyy.net# C ccc@zzz.co.jp# dtype: object
使用str.extract()方法仅提取正则表达式的第一个匹配项。
如果在str.extract()的第一个参数中指定了正则表达式模式,则将提取与()中包含的组部分匹配的字符串。
如果参数expand为True,则创建一个新对象为pandas.DataFrame,如果参数为False,则将创建一个新对象为pandas.Series。
df_single= s_org.str.extract('(.+)@', expand=True)print(df_single)print(type(df_single))# 0# A aaa# B bbb# C ccc#s= s_org.str.extract('(.+)@', expand=False)print(s)print(type(s))# A aaa# B bbb# C ccc# dtype: object#
在0.22.0版中,expand = False是默认设置,但将来,expand = True将是默认设置。由于结果将根据版本而变化,因此可以安全地显式指定扩展。
FutureWarning: currently extract(expand=None) means expand=False(return Index/Series/DataFrame) butin a future version of pandas this will be changed to expand=True(return DataFrame)
如果对正则表达式模式使用命名组(?P …),则该名称将按原样变为列名(列名)。
df_name= s_org.str.extract('(?P.+)@', expand=True)print(df_name)print(type(df_name))# local# A aaa# B bbb# C ccc#
如果()中包含多个组,则将返回pandas.DataFrame,其中每个组提取的部分为列。在这种情况下,无论pandas.DataFrame参数是否为True或False。 默认情况下,以0开头的序列号是列名,如果使用命名组(?P …),则为列名。
print(s_org.str.extract('(.+)@(.+)'))# 0 1# A aaa xxx.com# B bbb yyy.net# C ccc zzz.co.jpprint(s_org.str.extract('(?P.+)@(?P.+)'))# local domain# A aaa xxx.com# B bbb yyy.net# C ccc zzz.co.jp
如果没有匹配的部分,则为NaN。
print(s_org.str.extract('(a+)', expand=True))# 0# A aaa# B NaN# C NaN
str.extractall():提取所有匹配项
以下pandas.Series为例。
s_org2= pd.Series(['aaa@xxx.com, iii@xxx.com','bbb@yyy.net, jjj@yyy.net','ccc@zzz.co.jp'], index=['A','B','C'])print(s_org2)# A aaa@xxx.com, iii@xxx.com# B bbb@yyy.net, jjj@yyy.net# C ccc@zzz.co.jp# dtype: object
由于str.extract()仅返回第一个匹配部分,因此结果如下。
print(s_org2.str.extract('([a-z]+)@([a-z.]+)', expand=True))# 0 1# A aaa xxx.com# B bbb yyy.net# C ccc zzz.co.jp
使用str.extractall()方法提取所有匹配项。
str.extractall()的结果如下。 str.extractall()没有扩展参数,并且始终返回具有多索引索引的pandas.DataFrame。
df_all= s_org2.str.extractall('([a-z]+)@([a-z.]+)')print(df_all)# 0 1# match# A 0 aaa xxx.com# 1 iii xxx.com# B 0 bbb yyy.net# 1 jjj yyy.net# C 0 ccc zzz.co.jpprint(df_all.index)# MultiIndex(levels=[['A', 'B', 'C'], [0, 1]],# labels=[[0, 0, 1, 1, 2], [0, 1, 0, 1, 0]],# names=[None, 'match'])
请参阅以下文章,以指定和选择多索引pandas.DataFrame的元素。
请注意,即使只有一个匹配的部分,索引也将是多索引。我正在使用str.extract()示例中使用的Series。
print(s_org.str.extractall('([a-z]+)@([a-z.]+)'))# 0 1# match# A 0 aaa xxx.com# B 0 bbb yyy.net# C 0 ccc zzz.co.jp
构建数据框,我们要把b列以“-”分割成两列frompandas.core.frame import DataFrame df = DataFrame({"a" : ["1","2","3","4"], "b" : ["5-9","6-10","7-11","8-12"]}) print (df) a b 0 1 5-9 1 2 6-10 2 3 7-11
1.在列表中切割字符串
b=["5-9*13","6-10*14","7-11*15","8-12*16"] for iin range(len(b)): b[i]=b[i].split("-",1) ----------print(b) [['5', '9*13'], ['6', '10*14'], ['7', '11*15'], ['8', '12*16']]----------
2.在数据框中切割字符串
构建数据框,我们要把b列以“-”分割成两列
from pandas.core.frame import DataFrame df = DataFrame({"a" : ["1","2","3","4"],"b" : ["5-9","6-10","7-11","8-12"]}) ---------- print (df)a b 015-9126-10237-11348-12---------- df['b'], df['c'] = df['b'].str.split('-',1).str ---------- print (df)a b c 0159126102371134812----------
本文代码的github地址 series中的元素均为字符串时,通过str.split可将字符串按指定的分隔符拆分成若干列的形式。 例子: 拆分以逗号为分隔符的字符串 1 # -*- coding: utf-8 -*- 2 # 创建dataframe 3 import ...
原创博文,转载请注明出处!
series中的元素均为字符串时,通过str.split可将字符串按指定的分隔符拆分成若干列的形式。
例子:
拆分以逗号为分隔符的字符串
1 # -*- coding: utf-8 -*- 2 # 创建dataframe 3import pandas as pd 4 s = pd.DataFrame(['a,b,c','c,d,e']) 5print(s) 6 """ 7 0 8 0 a,b,c 9 1 c,d,e 10 """ 11 # 字符串拆分--expend = False 12 temp_expend_False = s[0].str.split(',') 13print(temp_expend_False) 14 """ 15 0 [a, b, c] 16 1 [c, d, e] 17 """ 18 19 # 字符串拆分--expend = True 20 temp_expend_True = s[0].str.split(',',expand = True) 21print(temp_expend_True) 22 """ 23 0 1 2 24 0 a b c 25 1 c d e 26 """
转载于:https://www.cnblogs.com/wanglei5205/p/8954498.html
如果直接用某一列和split()来分列是不行的,因为Series数据类型是没有split()的,所以需要先用.str将这一列转换为类似字符串的格式,就能够使用split()了。 str.split()有三个参数:第一个参数就是引号里的内容:...
直接加字符串出现了报错:pandas把这样的操作误认为了是sep分隔符号了,然后就出现错误了。 所以我们得先建一列: 先设置一个临时列 然后就可以使用cat()函数进行拼接: 使用cat()函数进行拼接 ...