Python split()函数工作不正常

Python split()函数工作不正常,python,pandas,dataframe,split,Python,Pandas,Dataframe,Split,尝试使用Pandas series str.split()函数拆分数据框“Actors”列中的值时,得到的值比我指定的拆分多: df['Actors'] = df['Actors'].str.split(",",n=3) 1 [timrobbins, morganfreeman, bobgunton, william... 2 [marlonbrando, alpacino, jamescaan, richardsca... 3 [alpacino, robert

尝试使用Pandas series str.split()函数拆分数据框“Actors”列中的值时,得到的值比我指定的拆分多:

df['Actors'] = df['Actors'].str.split(",",n=3)

1      [timrobbins, morganfreeman, bobgunton, william...
2      [marlonbrando, alpacino, jamescaan, richardsca...
3      [alpacino, robertduvall, dianekeaton, robertde...
4      [christianbale, heathledger, aaroneckhart, mic...
5      [martinbalsam, johnfiedler, leejcobb, egmarshall]
如果我尝试使用下面的代码段对上述结果进行切片,那么NaN将开始出现在结果中:

df['Actors'] = df['Actors'].str.split(",",n=3)[:3]
df['Actors'].head()

1    [timrobbins, morganfreeman, bobgunton, william...
2    [marlonbrando, alpacino, jamescaan, richardsca...
3    [alpacino, robertduvall, dianekeaton, robertde...
4                                                  NaN
5                                                  NaN
Name: Actors, dtype: object
或者,如果我使用如下所示的apply函数尝试代码段,则会获得正确的结果:

df['Actors'] = df['Actors'].apply(lambda x: x.split(",")[:3])
df['Actors'].head()

1        [timrobbins, morganfreeman, bobgunton]
2           [marlonbrando, alpacino, jamescaan]
3         [alpacino, robertduvall, dianekeaton]
4    [christianbale, heathledger, aaroneckhart]
5         [martinbalsam, johnfiedler, leejcobb]
Name: Actors, dtype: object
我想知道为什么会发生这种异常,以及在这种情况下如何正确使用str.split()函数

要进一步检查数据,您可以使用以下代码片段自行下载数据:

df = pd.read_csv('https://query.data.world/s/uikepcpffyo2nhig52xxeevdialfl7',index_col=0)

使用
df['Actors']=df['Actors'].str.split(“,”,n=3)[:3]
不是对字符串进行切片,而是对
系列进行切片。这就是为什么从第四行开始得到
NaN
s。使用[:2]重试,您将从第三行获得
NaN
s

使用
.apply(lambda x:x[:n])
可以对实际的单个字符串进行切片

或者,如果您不想使用
.apply()
,可以使用以下命令对每行内容而不是序列本身进行切片:

df['Actors']=df['Actors'].str.split(“,”).str[:3]

您使用的是
df['Actors']=df['Actors'].str.split(“,”,n=3)[:3]
不是对字符串进行切片,而是对
系列进行切片。这就是为什么从第四行开始得到
NaN
s。使用[:2]重试,您将从第三行获得
NaN
s

使用
.apply(lambda x:x[:n])
可以对实际的单个字符串进行切片

或者,如果您不想使用
.apply()
,可以使用以下命令对每行内容而不是序列本身进行切片:

df['Actors']=df['Actors'].str.split(“,”).str[:3]

我刚刚找到了一种方法来完成这项工作。到目前为止,我还没有一个解释。也许你们可以帮我解释一下,但这段话实际上很管用:

df['Actors'] = df['Actors'].str.split(",").str[:3]
df['Actors'].head()

1        [timrobbins, morganfreeman, bobgunton]
2        [marlonbrando, alpacino, jamescaan]
3        [alpacino, robertduvall, dianekeaton]
4        [christianbale, heathledger, aaroneckhart]
5        [martinbalsam, johnfiedler, leejcobb]
Name: Actors, dtype: object

我刚刚找到了一个方法来完成这件事。到目前为止,我还没有一个解释。也许你们可以帮我解释一下,但这段话实际上很管用:

df['Actors'] = df['Actors'].str.split(",").str[:3]
df['Actors'].head()

1        [timrobbins, morganfreeman, bobgunton]
2        [marlonbrando, alpacino, jamescaan]
3        [alpacino, robertduvall, dianekeaton]
4        [christianbale, heathledger, aaroneckhart]
5        [martinbalsam, johnfiedler, leejcobb]
Name: Actors, dtype: object

IIUC,您现在想知道
str.split(“,”,n=3)[:3]
str.split(“,”).str[:3]

str.split(“,”,n=3)[:3]
'上从左向右拆分,
并拆分3次。拆分的输出是一个系列,其中每一行都是一个列表。接下来,在输出上调用
[:3]
。它对输出的前3行进行切片,并仅返回新的3行序列

df['Actors']=df['Actors'].str.split(“,”,n=3)[:3]
是序列赋值。序列分配在索引上对齐。任何
df['Actors']。输出3行序列中不存在索引
,将在值中指定为
NaN
。这就是final
df['Actors']
只有3行有值,其余的是
NaN


df['Actors'].str.split(“,”).str[:3]
上,它是Pandas
索引.str
。也就是说,它是pandas str访问器的内置功能。它通过传递给
[]
的数字在每行上对整个序列进行切片。您可以在此处阅读更多内容:。它返回与原始序列相同的长度(行数相同)序列,其中每行值都被
[]

IIUC中的数字分割,现在您想知道
str.split(“,”,n=3)[:3]
str.split(,”).str[:3]

str.split(“,”,n=3)[:3]
'上从左向右拆分,
并拆分3次。拆分的输出是一个系列,其中每一行都是一个列表。接下来,在输出上调用
[:3]
。它对输出的前3行进行切片,并仅返回新的3行序列

df['Actors']=df['Actors'].str.split(“,”,n=3)[:3]
是序列赋值。序列分配在索引上对齐。任何
df['Actors']。输出3行序列中不存在索引
,将在值中指定为
NaN
。这就是final
df['Actors']
只有3行有值,其余的是
NaN


df['Actors'].str.split(“,”).str[:3]
上,它是Pandas
索引.str
。也就是说,它是pandas str访问器的内置功能。它通过传递给
[]
的数字在每行上对整个序列进行切片。您可以在此处阅读更多内容:。它返回与原始序列相同的长度(行数相同)序列,其中每行值按
[]

中的数字进行切片。您不会得到比指定值更多的值。很难说,因为逗号是值之间的分隔符,也是原始数据中的分隔符,并且它不会在字符串周围显示引号。您将获得
[“timrobbins”,“morganfreeman”,“bobgunton,william…”]
请尝试使用以下几行下载jupyter笔记本或i-python shell中的数据一次:df=pd.read_csv(')df['Actors']=df['Actors'].str.strip().str.lower().str.replace(“[^a-zA-Z,]”,“”)df['Actors']=df['Actors'].str.split(“,”,n=3)df['Actors'].head()。这将使您更好地理解数据。我不使用jupyter或i-python。您有任何可用的示例数据吗?问题是,
n=3
并不意味着在第三项之后放弃所有内容。这意味着所有内容都包含在第三项值中。您得到的值不会超过您指定的值。很难确定告诉,因为逗号是值之间的分隔符,也是原始数据中的分隔符,并且它不会在字符串周围显示引号。您将获得
[“timrobbins”,“morganfreeman”,“bobgunton,william…”
请尝试使用以下行在jupyter笔记本或i-python shell中下载数据一次:df=pd.read\u csv(')df['Actors']=df['Actors'].str.strip().str.lower()