我看过其他关于这方面的帖子,但我在尝试遵循解决方案时遇到了一个问题。我正在尝试拆分一列分数(作为字符串),这些分数列如下:
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给出了一些奇怪的“无”值或类似的东西?
发布于 2020-10-27 23:05:04
如果字符串中有多个可能的拆分,则最有可能发生这种情况。例如,您可能有一个值,如下所示:
"1-2-3"因此,本例中的展开将返回3列,但您将尝试将它们分配给2列('Home G','Away G')。
要修复它,请使用n参数将应对每个字符串执行的拆分次数显式指定为1,如Pandas documentation中所述
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发布于 2020-10-27 23:43:08
看起来你的数据需要清理一下。如果我是你,我会考虑运行一些检查,看看问题出在哪里。看起来您要么会遇到行中有太多-或没有-的情况。我将运行以下命令
df['check'] = [len(i) for i in df['Score'].str.findall(r'(-)')]
df[df['check] != 1]代码计算每行中的-数量,并标记出-不为1的任何行。希望这有助于标记出您的问题。
发布于 2020-10-28 00:26:01
使用下面的代码让它正常工作:
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]不过,我相信还有更好的办法。
https://stackoverflow.com/questions/64556999
复制相似问题