#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]
, я думаю, это более лаконично.