我看过其他有关此问题的帖子,但是在尝试遵循解决方案时遇到了一个问题。我正在尝试拆分一列得分(作为字符串),如下所示:
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给出了一些奇怪的无值或类似的东西?
答案 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]
尽管我确定还有更好的方法。