熊猫DF的str.split()问题

时间:2020-10-27 14:51:40

标签: python python-3.x pandas

我看过其他有关此问题的帖子,但是在尝试遵循解决方案时遇到了一个问题。我正在尝试拆分一列得分(作为字符串),如下所示:

1-0
2-3
0-3
...

我要使用的代码:

df[['Home G', 'Away G']] = df['Score'].str.split('-', expand=True)

我得到的错误:

ValueError: Columns must be same length as key

每个游戏都有分数,因此列长应该匹配吗?我曾经以为0给出了一些奇怪的无值或类似的东西?

3 个答案:

答案 0 :(得分:1)

如果字符串中可能有多个拆分,则很可能会发生这种情况。例如,也许您在某个地方有一个值:

"1-2-3"

因此,在这种情况下,扩展将返回3列,但您将尝试将它们分配给2列(“ Home G”,“ Away G”)。

要解决此问题,请按照{Pandas documentation中的说明,使用n参数将每个字符串的拆分次数明确指定为1。

df[['Home G', 'Away G']] = df['Score'].str.split(pat='-', n=1, expand=True)

默认情况下,n=-1表示“尽可能多地分割”。通过将其设置为1,您只能拆分一次。

编辑

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

df[['Home G', 'Away G']] = pd.DataFrame(df['Score'].str.findall("([0-9]+)").tolist(), index=df.index)

因此,对于看起来像这样的数据

0   12‒0
1   2–3
2   0–3

您最终会得到df之类的

    Score   Home G  Away G
0   12‒0    12      0
1   2–3     2       3
2   0–3     0       3

答案 1 :(得分:0)

似乎您的数据需要一些清理。如果您是我,我会考虑进行一些检查以查看问题出在哪里。好像您遇到的情况是行中有-太多或没有-的情况。我会运行以下

df['check'] = [len(i) for i in df['Score'].str.findall(r'(-)')]
df[df['check] != 1]

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

答案 2 :(得分:0)

使用以下命令使其正常工作:

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]

尽管我确定还有更好的方法。