使用Pandas,如何根据第一个空格进行分割。

问题描述 投票:0回答:5

所以我有一列代码:“dataset.csv”

0020-004241 purple
00532 - Blue
00121 - Yellow
055 - Greem
0025-097 - Orange

所需输出:

code              name_of_code
    0020-004241         purple 
    00532               blue 

我希望将代码和代码的单词分成两个不同的列。

我尝试过:

df =pandas.read_csv(dataset.txt)

df = pandas.concat([df, df.columnname.str.split('/s', expand=True)], 1)
df = pandas.concat([df, df.columnname.str.split('-', expand=True)], 1)

` 它给出了意想不到的输出: 紫色 无 蓝色 无 黄色 无 绿色 无 橙色 无

我应该如何正确分割这些数据?

python string pandas dataframe split
5个回答
25
投票

使用

str.split(" ", n=1)

例如:

import pandas as pd
df = pd.read_csv(filename,names=['code'])
df[['code','name_of_code']] = df["code"].str.split(" ", n=1, expand=True)
df["name_of_code"] = df["name_of_code"].str.strip("-")
print(df)

输出:

          code name_of_code
0  0020-004241       purple
1        00532         Blue
2        00121       Yellow
3          055        Greem
4     0025-097       Orange

请注意,在 Pandas 2.0.0 版本之前,

str.split(" ", 1)
也可以工作,但在 2.0.0 中已弃用,现在必须使用
str.split(" ", n=1)


2
投票

您可以通过几次拆分调用来处理此问题:

df = pd.DataFrame({'col': ['0020-004241 purple', '00532 - Blue',
                           '00121 - Yellow', '055 - Greem',
                           '0025-097 - Orange']})

df[['col1', 'col2']] = df['col'].str.split(n=1, expand=True)
df['col2'] = df['col2'].str.split().str[-1]

print(df)

                  col         col1    col2
0  0020-004241 purple  0020-004241  purple
1        00532 - Blue        00532    Blue
2      00121 - Yellow        00121  Yellow
3         055 - Greem          055   Greem
4   0025-097 - Orange     0025-097  Orange

2
投票

使用 lambda 的两行代码

df['code'] = df['code_and_name_of_code'].apply(lambda x: x.split(" ", 1)[0])
df['name_of_code'] = df['code_and_name_of_code'].apply(lambda x: x.split(" ", 1)[1].replace('-',''))

输入

import pandas as pd
df =pd.read_csv('data.txt')

    code_and_name_of_code
0   0020-004241 purple
1   00532 - Blue
2   00121 - Yellow
3   055 - Greem
4   0025-097 - Orange

应用 Lambda

df['code'] = df['code_and_name_of_code'].apply(lambda x: x.split(" ", 1)[0])
df['name_of_code'] = df['code_and_name_of_code'].apply(lambda x: x.split(" ", 1)[1].replace('-',''))

注意

  • x.split(" ", 1) 意味着在第一个空间上分割
  • x.split(" ", 1) 作为列表返回,其中 [0] 公开第一个空格之前的所有内容,[1] 公开第一个空格之后的所有内容

输出

    code_and_name_of_code   code         name_of_code
0   0020-004241 purple      0020-004241  purple
1   00532 - Blue            00532        Blue
2   00121 - Yellow          00121        Yellow
3   055 - Greem             055          Greem
4   0025-097 - Orange       0025-097     Orange

1
投票

加载 CSV 时,您可以使用正则表达式作为分隔符,以避免进一步拆分。

from io import StringIO
import pandas as pd

file = StringIO(
    """0020-004241 purple
    00532 - Blue
    00121 - Yellow
    055 - Greem
    0025-097 - Orange"""
)

df = pd.read_csv(file, sep='\s+\-*\s*', header=None)

当然,您可以添加标题,但我试图在这个示例中接近您的初始输入。

现在

read_csv
产生以下 DF:

             0       1
0  0020-004241  purple
1        00532    Blue
2        00121  Yellow
3          055   Greem
4     0025-097  Orange

0
投票

您还可以将

.str.extract
与正则表达式一起使用。

df[['code', 'name_of_code']] = df.col.str.extract('(.*\d+)\s-?\s?(.*)', expand=True)

print(df)
                  col         code name_of_code
0  0020-004241 purple  0020-004241       purple
1        00532 - Blue        00532         Blue
2      00121 - Yellow        00121       Yellow
3         055 - Greem          055        Greem
4   0025-097 - Orange     0025-097       Orange
© www.soinside.com 2019 - 2024. All rights reserved.