Почему строковые методы перестают работать со столбцами объектов при использовании в циклах for - PullRequest
1 голос
/ 06 февраля 2020

Я выполняю этот код в блокноте Jupyter.

Я пытаюсь изменить тип объекта в моих фреймах данных, который выглядит следующим образом:

column 1
#Green #Blue #Orange
#Green #Red
#Blue #Orange
#Orange

На это:

column 1
[Green, Blue, Orange]
[Green, Red]
[Blue, Orange]
[Orange]

Когда я пытаюсь использовать строковые методы для одного столбца в одном кадре данных со следующим кодом, это работает.

df1['column 1'] = df1['column 1'].str.replace('#', ' ') 

df1['column 1'] = df1['column 1'].str.split(',')

Но когда я пытаюсь сжать этот процесс в все oop для одного и того же столбца в нескольких фреймах данных я получаю ошибку атрибута (ie AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas):

df_list = [df1, df2, df3, df4, df5]

for df in df_list:
    df['column 1'] = df['column 1'].str.replace('#', ' ') 
    df['column 1'] = df['column 1'].str.split(',')

Почему это происходит, когда они по сути одинаковы?

Это это ошибка трассировки в моем ноутбуке Jupyter:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-276-51c1ece881fa> in <module>
      4 for df in df_list:
      5     df['player_tags'] = df['player_tags'].str.replace('#', ' ')
----> 6     df['player_tags'] = df['player_tags'].str.split(',')

~/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py in __getattr__(self, name)
   3608         if (name in self._internal_names_set or name in self._metadata or
   3609                 name in self._accessors):
-> 3610             return object.__getattribute__(self, name)
   3611         else:
   3612             if name in self._info_axis:

~/anaconda3/lib/python3.6/site-packages/pandas/core/accessor.py in __get__(self, instance, owner)
     52             # this ensures that Series.str.<method> is well defined
     53             return self.accessor_cls
---> 54         return self.construct_accessor(instance)
     55 
     56     def __set__(self, instance, value):

~/anaconda3/lib/python3.6/site-packages/pandas/core/strings.py in _make_accessor(cls, data)
   1908             # (instead of test for object dtype), but that isn't practical for
   1909             # performance reasons until we have a str dtype (GH 9343)
-> 1910             raise AttributeError("Can only use .str accessor with string "
   1911                                  "values, which use np.object_ dtype in "
   1912                                  "pandas")

AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas

1 Ответ

1 голос
/ 06 февраля 2020

Из кода, который вы предоставили - он должен работать (на самом деле, должен работать, предполагая, что все ваши элементы имеют git).

Вы всегда можете взять пример кода и проверить его на своем конце:

df = pd.DataFrame({"column 1":['#Green #Blue #Orange','#Green #Red','#Blue #Orange','#Orange']})

df1 = df.copy()
df2 = df.copy()
df3 = df.copy()

df_list = [df1, df2, df3]

for df in df_list:
    df['column 1'] = df['column 1'].str.replace('#', ' ') 
    df['column 1'] = df['column 1'].str.split(',')

работает как шарм! вывод - в вашем коде df_list вы ' повторная отправка одного и того же df дважды (или более). Пример df2 является ссылкой на df1, и это создаст вам проблему. Обратите внимание, что в моем коде выше df1 df2 df3 скопированы (как указано в ссылке)

проверьте это (это приведет к ошибке):

df = pd.DataFrame({"column 1":['#Green #Blue #Orange','#Green #Red','#Blue #Orange','#Orange']})
df['column 1'] = df['column 1'].str.replace('#', ' ')
df['column 1'] = df['column 1'].str.split(',')

и затем сделайте это снова:

df['column 1'] = df['column 1'].str.replace('#', ' ')
df['column 1'] = df['column 1'].str.split(',')

и вы получите сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...