Попытка сохранить индекс из df ['column_name']. Str.split ('') [index] выдает ошибку индекса в Pandas - PullRequest
0 голосов
/ 08 февраля 2020

Я работаю с набором данных из kaggle на NBA allstars (https://www.kaggle.com/fmejia21/nba-all-star-game-20002016) [ссылка для тех, кто хочет запустить его самостоятельно]. Набор данных выглядит следующим образом:

In [3]: df1.head(3)
Out[3]: 
   Year         Player Pos  ...                       Selection Type   NBA Draft Status    Nationality
0  2016  Stephen Curry   G  ...  Western All-Star Fan Vote Selection  2009 Rnd 1 Pick 7  United States
1  2016   James Harden  SG  ...  Western All-Star Fan Vote Selection  2009 Rnd 1 Pick 3  United States
2  2016   Kevin Durant  SF  ...  Western All-Star Fan Vote Selection  2007 Rnd 1 Pick 2  United States

[3 rows x 9 columns]

Я пытаюсь захватить черновую позицию в столбце «Статус черновика NBA» и сохранить ее в другом столбце, поэтому я начинаю с проверки разделения :

In [4]: df1['NBA Draft Status'].str.split(' ')
Out[4]: 
0       [2009, Rnd, 1, Pick, 7]
1       [2009, Rnd, 1, Pick, 3]

Так что это кажется достаточно простым; просто возьмите предмет в четвертой позиции. Если это выбор второго раунда, добавьте 30 к этому числу. Я использую это:

In [5]: positions = []
   ...: for draft in df1['NBA Draft Status']:
   ...:     if 'Rnd 2' in draft:
   ...:         position = draft.split(' ')[4]
   ...:         position = int(position) + 30
   ...:         positions.append(position)
   ...:     else:
   ...:         position = draft.split(' ')[4]
   ...:         position = int(position)
   ...:         positions.append(position)

, и он выдает ошибку индекса:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-5-0946ed392ea2> in <module>
      6         positions.append(position)
      7     else:
----> 8         position = draft.split(' ')[4]
      9         position = int(position)
     10         positions.append(position)

IndexError: list index out of range

Хорошо ... теперь вот где вопрос; почему это вне диапазона? При попытке выяснить, в чем проблема, я обнаружил, что могу напечатать этот индекс, но по какой-либо причине не могу добавить его в пустой список. Это работает:

In [6]: for draft in df1['NBA Draft Status']:
   ...:     print(draft.split(' ')[4])
   ...:     break
   ...: 
7

Может кто-нибудь объяснить мне, что происходит? Я знаю, что это довольно многословно, но я не знал, как еще передать проблему, не предоставив некоторого фона для набора данных.

1 Ответ

0 голосов
/ 08 февраля 2020

Проблема в том, что у вас есть некоторые значения в df1['NBA Draft Status'], в которых есть только 3 пробела, поэтому, когда вы вызываете .split() для них, результирующий список имеет длину 4 элемента, что при индексировании 0 приводит к вашей ошибке индекса.

df1['length'] = df1['NBA Draft Status'].apply(lambda draft: len(draft.split()))
df2 = df1.loc[df1.length == 4,:]
df2['NBA Draft Status']
Out[74]: 
309    1996 NBA Draft, Undrafted
334    1996 NBA Draft, Undrafted
346    1998 NBA Draft, Undrafted
348    1996 NBA Draft, Undrafted
360    1996 NBA Draft, Undrafted
371    1998 NBA Draft, Undrafted
Name: NBA Draft Status, dtype: object

Удалите их с помощью: df1 = df1.loc[df1.length == 5,:], а затем повторно запустите свой код. Это будет работать.

...