Эффективно заменить значения в панде DF - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь эффективно заменить определенные значения значимой информацией в pandas df.Ниже приведен пример df's, с которым я работаю.

Этот df является примером значимой информации.Каждый трехбуквенный код соответствует реальному месту.Например, ABC = Home

import pandas as pd

m = pd.DataFrame({
        'Place' : ['Home','Away'],
        'Code' : ['ABC','DEF']})  

Вывод:

  Code  Place
0  ABC   Home
1  DEF   Away

Я хочу заменить значения Column D информацией о месте.Так что Home заменит ABC.После этого кода есть дополнительные пункты, но я могу удалить их достаточно легко.

d = pd.DataFrame({
    'C' : ['08:00:00','XX','08:10:00','XX','08:41:42','XX','08:50:00','XX', '09:00:00'],
    'D' : ['ABC-Thu','','ABC-Thu','','DEF-Thu','','ABC-Thu','','DEF-Thu'],
    'E' : ['Num:','','Num:','','Num:','','Num:','','Num:'],
    'F' : ['1','','1','','1','','1','','1'],   
    'A' : ['A','','A','','A','','A','','A'],           
    'B' : ['Stop','','Res','','Stop','','Start','','Res']
    })

В данный момент я делаю это вручную как таковой,

#remove last 4 items
d['D'] = [x[:-4] for x in d['D']]

#replace with appropriate place
d['D'] = d['D'].replace(['ABC'], 'Home')
d['D'] = d['D'].replace(['DEF'], 'Away')

Вывод:

   A      B         C     D     E  F
0  A   Stop  08:00:00  Home  Num:  1
1                  XX               
2  A    Res  08:10:00  Home  Num:  1
3                  XX               
4  A   Stop  08:41:42  Away  Num:  1
5                  XX               
6  A  Start  08:50:00  Home  Num:  1
7                  XX               
8  A    Res  09:00:00  Away  Num:  1

Но количество разных мест, которые нужноЗаменить можно до 40-50.Коды также могут меняться с каждым набором данных.Так что ABC может равняться Home в один день и Pool в следующий.Как вы можете себе представить, не очень эффективно каждый день менять 40-50 разных мест.

Есть ли более эффективный цикл по каждому коду и замена информацией о месте?

1 Ответ

0 голосов
/ 01 июня 2018

Я думаю, что нужно удалить последние 4 символы и map с помощью Series, созданные set_index, последнее добавление fillna длязаменить несоответствующие значения на исходные значения D:

d['D'] = d['D'].str[:-4].map(m.set_index('Code')['Place']).fillna(d['D'])
print (d)
   A      B         C     D     E  F
0  A   Stop  08:00:00  Home  Num:  1
1                  XX               
2  A    Res  08:10:00  Home  Num:  1
3                  XX               
4  A   Stop  08:41:42  Away  Num:  1
5                  XX               
6  A  Start  08:50:00  Home  Num:  1
7                  XX               
8  A    Res  09:00:00  Away  Num:  1

Подробности :

print (d['D'].str[:-4])
0    ABC
1       
2    ABC
3       
4    DEF
5       
6    ABC
7       
8    DEF
Name: D, dtype: object

print (m.set_index('Code')['Place'])
Code
ABC    Home
DEF    Away
Name: Place, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...