#python #pandas #dataframe #split
Вопрос:
Я пытаюсь разделить все значения столбцов и хочу сохранить только второй индекс , т. Е. -1
Он работает с отдельными столбцами, str.split(': ').str[-1]
но, будучи новичком, я не могу применить его для всех столбцов.
Действительно, я хочу сохранить значения из каждого столбца после :
.
Может быть, написать функцию и применить ее к df, но не получить ее.
Фрейм данных:
>>> df
LoginShell ExpiryDate UID
0 loginShell: /bin/bash Enddate: 20991212 uid: auto_soc
1 loginShell: /bin/bash Enddate: 20991212 uid: sambakul
2 loginShell: /bin/bash Enddate: 20991212 uid: services2go-jenkins
3 loginShell: /bin/bash Enddate: 20991212 uid: rdtest0
4 loginShell: /bin/bash Enddate: 20991212 uid: sudo
.. ... ... ...
171 loginShell: /bin/bash Enddate: 20991230 uid: elmadm
172 loginShell: /bin/bash Enddate: 20991231 uid: git
173 loginShell: /bin/bash Enddate: 20991231 uid: rhspadm
174 loginShell: /bin/bash Enddate: 20991231 uid: bossadm
175 loginShell: /bin/bash Enddate: 20991231 uid: ngvp_vmware_management_tst
[176 rows x 3 columns]
Результат для отдельного столбца:
>>> df['LoginShell'].str.split(': ').str[-1]
0 /bin/bash
1 /bin/bash
2 /bin/bash
3 /bin/bash
4 /bin/bash
...
171 /bin/bash
172 /bin/bash
173 /bin/bash
174 /bin/bash
175 /bin/bash
Name: LoginShell, Length: 176, dtype: object
Ожидаемые значения:
LoginShell ExpiryDate UID
0 /bin/bash 20991212 auto_soc
1 /bin/bash 20991212 sambakul
Любая помощь будет так полезна
Ответ №1:
Попробуйте с applymap
:
df = df.applymap(lambda x: x.split(': ', 1)[-1])
df
:
LoginShell ExpiryDate UID
0 /bin/bash 20991212 au:to:_soc
1 /bin/bash 20991212 sambakul
2 /bin/bash 20991212 services2go-jenkins
3 /bin/bash 20991212 rdtest0
Полный Код:
import pandas as pd
df = pd.DataFrame({
'LoginShell': ['loginShell: /bin/bash', 'loginShell: /bin/bash',
'loginShell: /bin/bash', 'loginShell: /bin/bash'],
'ExpiryDate': ['Enddate: 20991212', 'Enddate: 20991212',
'Enddate: 20991212', 'Enddate: 20991212'],
'UID': ['uid: au:to:_soc', 'uid: sambakul', 'uid: services2go-jenkins',
'uid: rdtest0']
})
df = df.applymap(lambda x: x.split(': ', 1)[-1])
Как def
функция, а не как lambda
:
def split_on_first_colon(x):
return x.split(': ', 1)[-1]
df = df.applymap(split_on_first_colon)
Комментарии:
1. мило! хотя, если у нас есть какие-либо дополнительные » :» в строках, то это вернет только заключительную часть. Так что было бы безопаснее сделать
df.applymap(lambda x: ': '.join(x.split(': ')[1:]))
2. Это выглядит очень мило @Генри Экер, как мы можем написать функцию для того же самого на всякий случай, чтобы обойти другой путь.
3. Обновлено, чтобы быть безопасным для нескольких двоеточий @Matt. См.Первую строку в качестве примера.
4. @HenryEcker, я имею в виду «нравится
def split_vlaues(): return something
«, а затем подать заявку. извините, я просто бросаю свою идею, я могу ошибаться. в любом случае я принял ответ и уже 1.5. Просто для целей обучения, не более того :-).