Разделите все имена столбцов на определенные символы и используйте последнюю часть в качестве новых имен столбцов в Pandas

#python-3.x #pandas #dataframe #split

#python-3.x #pandas #dataframe #разделить

Вопрос:

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

id, xxx>xxx>x, yy>y, zzzz>zzz>zz>z, ...

Мне нужно разделить на второй > с правой стороны и использовать первый элемент в качестве новых имен столбцов, id, xxx>x, yy>y, zz>z, ... .

Я использовал: 'zzzz>zzz>zz>z'.rsplit('>', 1)[-1] чтобы получить z ожидаемое новое имя столбца для третьего столбца.

Когда я использую: df.columns = df.columns.rsplit('>', 1)[-1] :

Выход:

 ValueError: Length mismatch: Expected axis has 13 elements, new values have 2 elements
  

Как я мог бы сделать это правильно?

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

1. быстрый способ — проверить, сколько значений возвращается df.columns.rsplit('>', 1)[-1] . Это должно быть вашим первым указателем на понимание проблемы. Кроме того, из того, что я могу сделать вывод, вы должны вместо этого использовать это : df.columns.str.rsplit('>').str[-1] .

2. Извините, это вызывает ошибку: AttributeError: 'Index' object has no attribute 'rsplit' .

3. хм, может быть, это : data.str.rsplit(">", 2).str[-2:].str.join(">") ?

4. Потрясающе, это работает, вы можете ответить на вопрос своим кодом, если хотите.

5. нахх. все в порядке. SO — хорошее место для изучения и обмена.

Ответ №1:

попробуйте выполнить:

 names = pd.Index(['xxx>xxx>x', 'yy>y', 'zzzz>zzz>zz>z'])
names = pd.Index([idx[-1] for idx in names.str.rsplit('>')])
  
 print(names)
# Index(['x', 'y', 'z'], dtype='object')
  

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

1. спасибо, но почему бы и нет df.columns = df.columns.str.rsplit('>').str[-1] , я думаю, это более лаконично.