Панды, как разделить влау каждого столбца на основе двоеточия

#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. Просто для целей обучения, не более того :-).