#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