Функция Pandas str.split () не работает должным образом - PullRequest
0 голосов
/ 09 ноября 2019

При попытке разделить значения в столбце «Актеры» моего фрейма данных с помощью функции str.split () серии Pandas я получаю больше значений, чем указано в разделениях:

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

В качестве альтернативы, если я пытаюсь использовать фрагмент с функцией применения, как показано ниже, достигаются надлежащие результаты:

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 ]

2 голосов
/ 09 ноября 2019

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'].index не существует в выходных 3-рядных рядах будет назначен как NaN в значении. Это причина, по которой final df['Actors'] имеет только 3 строки, имеющие значения, а остальные NaN

На df['Actors'].str.split(",").str[:3], это Pandas Indexing with .str. То есть, это встроенная функция доступа к pandas str. Он нарезает целую серию в каждой строке по номеру, передающему []. Вы можете прочитать это больше здесь: https://pandas.pydata.org/pandas-docs/stable/user_guide/text.html#indexing-with-str. Возвращает серию одинаковой длины (с таким же количеством строк), что и оригинал, где значения каждой строки разрезаны по числу внутри [].

1 голос
/ 09 ноября 2019

То, что вы делаете с df['Actors'] = df['Actors'].str.split(",",n=3)[:3], это не разрезание строки, а нарезка Series. Вот почему вы получаете NaN с, начиная с четвертого ряда. Повторите попытку с [: 2], и вы получите NaN s из третьего ряда.

С .apply(lambda x: x[:n]) вы нарезаете фактические отдельные строки.

0 голосов
/ 09 ноября 2019

Я только что нашел способ сделать это. На данный момент у меня нет объяснения этому. Возможно, вы, ребята, можете помочь мне с объяснением, но этот фрагмент на самом деле работает:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...