Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python str.split()问题与DF_Python_Python 3.x_Pandas - Fatal编程技术网

Python str.split()问题与DF

Python str.split()问题与DF,python,python-3.x,pandas,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给出了一些奇怪的no

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

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给出了一些奇怪的none值或类似的值?

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

"1-2-3"
因此,本例中的扩展将返回3列,但您将尝试将它们分配到2列(“Home G”、“Away G”)

要解决此问题,请使用
n
参数将每个字符串上应执行的拆分次数显式指定为1,如下所述:

默认情况下,
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

看来你的数据需要清理了。如果我是你,我会考虑开一些支票,看看问题出在哪里。您可能会遇到这样的情况:行中的
-
太多,或者没有
-
s。我将运行以下命令

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

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

使用以下方法可以解决问题:

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]

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

我已经尝试了你的代码,将df定义为df=pd.DataFrame({'Score':['1-0','2-3','0-3']}),它对我有效。也许其中一行没有
'-'
字符?尝试post中的解决方案。确保
df[~df['Score'].str.contains('-')]
是一个空的
DataFrame
@CollinHeist我认为没有“-”字符不应该是问题。例如,请参见:
df=pd.DataFrame({'Score':['1-0','2-3','0-3',np.NaN','32',3]})
,然后是
df.Score.str.split('-',expand=True)
(返回两列)。但是,如果不指定要进行多少次拆分,则使用多个“-”字符可能会有问题。@LorenaGil这将要求我在赛季结束时手动输入每场比赛的分数,而在我的情况下,这不是一个非常实用的选项,因为它需要时间和空间。当我运行此操作时,它会再次返回所有57行。我可以看到所有57行,但是没有一行缺少
-
,这仍然导致了相同的错误。我可以看到该列的所有值,表不是很大,所有分数的格式和长度都相同,所以我不确定是什么原因造成了这个问题。@kr419所以当你只应用
df['Score'].str.split(“-”,n=1)
,返回的每个列表是否只有2个元素?当我只应用
df['Score'].str.split(“-”,n=1)
它返回的分数与DF中的分数相同,只是每个分数现在都是这样的列表:
[1-0][2-3][0-3]
DF.score.dtype
表示对象<代码>类型(df.Score[0])表示String@kr419是否可能您的“连字符”实际上是一个en破折号(–)或一个数字破折号(‒)?这些是不同的符号,不能通过在公共连字符(“-”)上拆分来提取。也许这就是为什么你在下面建议的仅取字符串的第一和第三个元素的选项有效。请参阅我在答案中添加的替代解决方案,该解决方案的灵感来自于此解决方案,避免了处理连字符或依赖分数长度。
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]