Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将列拆分为字符串后的两个空格_Python_String_Pandas_Series - Fatal编程技术网

Python 将列拆分为字符串后的两个空格

Python 将列拆分为字符串后的两个空格,python,string,pandas,series,Python,String,Pandas,Series,我发现一些拆分列的方法很有用,但没有一种像我尝试做的那样具体 我有一个包含州和学校信息的专栏,其中列出了如下人员: Col1 Miami, FLSchoolA Charlotte, NCSchoolB 我想在字符串,ST之后分开,但是很明显,状态是不同的。我希望此示例如下所示: Col1 Col2 Miami, FL SchoolA Charlotte, NC SchoolB 任何帮助都将不胜感激。您可以使用.str.extract与2个捕获组进行

我发现一些拆分列的方法很有用,但没有一种像我尝试做的那样具体

我有一个包含州和学校信息的专栏,其中列出了如下人员:

Col1
Miami, FLSchoolA
Charlotte, NCSchoolB
我想在字符串
,ST
之后分开,但是很明显,状态是不同的。我希望此示例如下所示:

Col1             Col2
Miami, FL        SchoolA
Charlotte, NC    SchoolB

任何帮助都将不胜感激。

您可以使用
.str.extract
与2个捕获组进行此操作:

df.Col1.str.extract('(.*,\s[A-Z]{2})(.*)')

               0        1
0      Miami, FL  SchoolA
1  Charlotte, NC  SchoolB

您可以将
str.index
与切片一起使用:

df = pd.DataFrame({'Col1': ['Miami, FLSchoolA', 'Charlotte, NCSchoolB']})

def splitter(val):
    idx = val.index(',') + 4
    return val[:idx], val[idx:]

df['Col1'], df['Col2'] = list(zip(*map(splitter, df['Col1'])))

print(df)

#             Col1     Col2
# 0      Miami, FL  SchoolA
# 1  Charlotte, NC  SchoolB

这里的其他答案似乎不包括寻找州的具体需要。我的建议是:

df = pd.DataFrame({'Col1': ['Miami, FLSchoolA', 'Charlotte, NCSchoolB']})

states = """AK AL AR AZ CA CO CT DE FL GA HI IA ID IL IN KS KY LA MA MD ME
 MI MN MO MS MT NC ND NE NH NJ NM NV NY OH OK OR PA RI SC SD TN TX UT VA VT
 WA WI WV WY""".split()

def splitter(ser):
    state = [x for x in states if x in ser]
    if len(state) > 0:
        st = ', ' + state[0]
        a = ser.split(st)
        return [a[0] + st, a[1]]

df.Col1.transform(splitter)
返回一系列两个列表,这些列表可以很容易地分成列:

0        ['Miami, FL', 'SchoolA']
1    ['Charlotte, NC', 'SchoolB']
Name: Col1, dtype: object

可能有一种方法可以将此条件写入
pd.Series.str.split
,这样您就可以放入
expand=True
,一步完成。

@JRibkr
.str.split
不是特别有用,因为这里我们需要在第一个字符串中包含拆分条件。向后看可能是可行的,但要拆分的实际模式是空的,这可能使其不可能+如果你想真正学究化,并且确保只包含状态,而不是例如,
,GH
,那么将正则表达式更改为
f'(.*,\s[{“|”)。使用@JoshFriedlander中的
状态加入(状态)}{{2}(.*)
。但是如果你的数据足够干净的话,可能是杀伤力太大了。当我将
.str.extract
函数分配给一列时,我丢失了分割的第二部分(学校)。如何将这些存储在数据框中?@a.powell。一个安全的替代方法是连接结果
pd.concat([df,df.Col1.str.extract('(.*.\s[A-Z]{2})(.*]),axis=1)
,它只会将这两个拆分列附加到原始列。但是如果您不再关心原始数据,为什么不使用上面的
DataFrame
输出(只需重命名列)?当我尝试仅使用数据帧时,它会将第二列返回为空。有什么线索吗?@a.powell我不知道。根据您提供的数据,分割似乎是可行的,如果您可以创建一个复制问题的模型,那么最好再问一个问题,因为评论中的长时间讨论通常是不受欢迎的。您可以使用
df.to_dict()
轻松向我们提供有问题的数据。