Фрейм данных Pandas показывает, что ячейки являются строками, но возвращает ошибку, когда я пытаюсь разделить ячейки

#python #pandas #dataframe #split #tuples

#питон #панды #фрейм данных #расщеплять #кортежи

Вопрос:

У меня есть фрейм данных Pandas df со столбцом df['auc_all'] , который содержит кортеж с двумя значениями (например (0.54, 0.044) )

Когда я бегу:

 type(df['auc_all'][0]) gt;gt;gt; str  

И все же, когда я бегу:

 def convert_str_into_tuple(self, string):  splitted_tuple = string.split(',')  value1 = float(splitted_tuple[0][1:])  value2 = float(splitted_tuple[1][1:-1])  return (value1, value2)  df['auc_all'] = df['auc_all'].apply(convert_str_into_tuple)  

Я получаю следующую ошибку:

 df = full_df.create_full() Traceback (most recent call last):    File "lt;ipython-input-437-34fc05204badgt;", line 18, in create_full  df['auc_all'] = df['auc_all'].apply(self.convert_str_into_tuple)   File "C:Users20200016Anaconda3libsite-packagespandascoreseries.py", line 4357, in apply  return SeriesApply(self, func, convert_dtype, args, kwargs).apply()   File "C:Users20200016Anaconda3libsite-packagespandascoreapply.py", line 1043, in apply  return self.apply_standard()   File "C:Users20200016Anaconda3libsite-packagespandascoreapply.py", line 1099, in apply_standard  mapped = lib.map_infer(   File "pandas_libslib.pyx", line 2859, in pandas._libs.lib.map_infer   File "lt;ipython-input-437-34fc05204badgt;", line 63, in convert_str_into_tuple  splitted_tuple = string.split(',')  AttributeError: 'tuple' object has no attribute 'split'  

Это, по-видимому, указывает на то, что в ячейке содержится кортеж.

Однако:

 df['auc'][0][0] gt;gt;gt; '('  

Кажется, что тип переменной меняется в зависимости от того, где я ее использую. Это действительно происходит?

Комментарии:

1. зачем вам это нужно в качестве кортежа?

2. Для лучшего обзора. У меня есть несколько похожих столбцов с кортежами, и я буду использовать их комбинированным способом. Если я распакую их в разных столбцах, у меня будет еще много столбцов, и мне нужно будет вызывать их отдельно.

3. Имеет смысл — просто хотел проверить, нет ли другого способа, которым мы могли бы вам помочь.

Ответ №1:

Если ваш столбец содержит кортежи в качестве строки, используйте pd.eval :

 df['auc_all'] = pd.eval(df['auc_all'])  

Пример:

 # df = pd.DataFrame({'auc_all': ['(0.54, 0.044)']}) gt;gt;gt; df  auc_all 0 (0.54, 0.044)  gt;gt;gt; type(df['auc_all'][0]) str   # df['auc_all'] = pd.eval(df['auc_all']) gt;gt;gt; df  auc_all 0 [0.54, 0.044]  gt;gt;gt; type(df['auc_all'][0]) list  

Недостатком является то, что ваш кортеж преобразуется в список, но вы можете использовать literal_eval из ast модуля:

 # import ast # df['auc_all'] = df['auc_all'].apply(ast.literal_eval) gt;gt;gt; df  auc_all 0 (0.54, 0.044)  gt;gt;gt; type(df['auc_all'][0]) tuple