首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pandas DF的str.split()问题

pandas DF的str.split()问题
EN

Stack Overflow用户
提问于 2020-10-27 22:51:41
回答 3查看 526关注 0票数 0

我看过其他关于这方面的帖子,但我在尝试遵循解决方案时遇到了一个问题。我正在尝试拆分一列分数(作为字符串),这些分数列如下:

代码语言:javascript
复制
1-0
2-3
0-3
...

我尝试使用的代码如下:

代码语言:javascript
复制
df[['Home G', 'Away G']] = df['Score'].str.split('-', expand=True)

我收到以下错误:

代码语言:javascript
复制
ValueError: Columns must be same length as key

每一场比赛都有一个分数,那么列长度应该匹配吗?我的一个想法是,0给出了一些奇怪的“无”值或类似的东西?

EN

回答 3

Stack Overflow用户

发布于 2020-10-27 23:05:04

如果字符串中有多个可能的拆分,则最有可能发生这种情况。例如,您可能有一个值,如下所示:

代码语言:javascript
复制
"1-2-3"

因此,本例中的展开将返回3列,但您将尝试将它们分配给2列('Home G','Away G')。

要修复它,请使用n参数将应对每个字符串执行的拆分次数显式指定为1,如Pandas documentation中所述

代码语言:javascript
复制
df[['Home G', 'Away G']] = df['Score'].str.split(pat='-', n=1, expand=True)

默认情况下为n=-1,意思是“尽可能多地拆分”。通过将其设置为1,您仅拆分一次。

编辑

如果您不确定连字符或其他符号的数量或类型,另一种解决方案是使用正则表达式从每个字符串中提取两组数字。例如:

代码语言:javascript
复制
df[['Home G', 'Away G']] = pd.DataFrame(df['Score'].str.findall("([0-9]+)").tolist(), index=df.index)

因此,对于像这样的数据

代码语言:javascript
复制
0   12‒0
1   2–3
2   0–3

你最终会得到一个像这样的df

代码语言:javascript
复制
    Score   Home G  Away G
0   12‒0    12      0
1   2–3     2       3
2   0–3     0       3
票数 1
EN

Stack Overflow用户

发布于 2020-10-27 23:43:08

看起来你的数据需要清理一下。如果我是你,我会考虑运行一些检查,看看问题出在哪里。看起来您要么会遇到行中有太多-或没有-的情况。我将运行以下命令

代码语言:javascript
复制
df['check'] = [len(i) for i in df['Score'].str.findall(r'(-)')]
df[df['check] != 1]

代码计算每行中的-数量,并标记出-不为1的任何行。希望这有助于标记出您的问题。

票数 0
EN

Stack Overflow用户

发布于 2020-10-28 00:26:01

使用下面的代码让它正常工作:

代码语言:javascript
复制
df['Home G'] = 0
df['Away G'] = 0
for index,row in df.iterrows():
    df['Home G'][index] = row['Score'][0]
    df['Away G'][index] = row['Score'][2]

不过,我相信还有更好的办法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64556999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档