熊猫的str.split()函数无法正常工作

时间:2019-11-08 21:24:07

标签: python pandas dataframe split

在尝试使用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)

3 个答案:

答案 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