在尝试使用Pandas系列str.split()函数拆分数据框“演员”列中的值时,我得到的值比我指定的拆分值还要多:
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)
答案 0 :(得分:2)
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]
是系列分配。系列分配与索引对齐。输出的3行系列中不存在任何df['Actors'].index
,其值将分配为NaN
。这就是为什么最终df['Actors']
只有3行包含值,其余为NaN
在df['Actors'].str.split(",").str[:3]
上是熊猫Indexing with .str
。即,它是pandas str访问器的内置功能。它按传递给[]
的数字在每行上切片整个序列。您可以在这里https://pandas.pydata.org/pandas-docs/stable/user_guide/text.html#indexing-with-str阅读更多内容。它会返回与原始序列相同长度(相同行数)的序列,在该序列中,每行值均按[]
中的数字进行切片。
答案 1 :(得分:1)
您对df['Actors'] = df['Actors'].str.split(",",n=3)[:3]
所做的操作不是切片字符串,而是切片Series
。这就是为什么您从第四行开始获得NaN
的原因。使用[:2]再试一次,您将从第三行中获得NaN
。
使用.apply(lambda x: x[:n])
可以切出实际的单个字符串。
答案 2 :(得分:0)
我刚刚找到了完成此任务的方法。截至目前我还没有解释。也许你们可以在解释部分中为我提供帮助,但是此代码段确实有效:
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