Очистка данных в пандах - PullRequest
       13

Очистка данных в пандах

0 голосов
/ 10 февраля 2019

У меня есть фрейм данных в следующем формате:

 Col
 Honda [edit]   
 Accord (4 models)[1]  
 Civic  (4 models)[2]  
 Pilot  (3 models)[1]  
 Toyota [edit]  
 Prius  (4 models)[1]  
 Highlander (3 models)[4]  
 Ford [edit]  
 Explorer (2 models)[1]  

Я хочу данные в следующем формате:

  A         B
  Honda     Accord  
  Honda     Civic  
  Honda     Pilot  
  Toyota    Prius   
  Toyota    Highlander

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

IIUC 1-й найдите Col, которые содержат редактирование, используя str.contains, мы используем ffill (все предполагаемые данные были упорядочены), после этого нам просто нужно очистить ваши данные с помощью str.split

df['A']=df.Col[df.Col.str.contains('edit')]
df.A=df.A.ffill()
df
Out[58]: 
                          Col                A
0             Honda [edit]     Honda [edit]   
1      Accord (4 models)[1]    Honda [edit]   
2      Civic  (4 models)[2]    Honda [edit]   
3      Pilot  (3 models)[1]    Honda [edit]   
4             Toyota [edit]    Toyota [edit]  
5      Prius  (4 models)[1]    Toyota [edit]  
6  Highlander (3 models)[4]    Toyota [edit]  
7               Ford [edit]      Ford [edit]  
8    Explorer (2 models)[1]      Ford [edit]  

df.apply(lambda x : df.Col.str.split(r'[(|[]').str[0],1).query('Col!=A')
Out[59]: 
          Col       A
1      Accord   Honda
2       Civic   Honda
3       Pilot   Honda
5       Prius  Toyota
6  Highlander  Toyota
8    Explorer    Ford
0 голосов
/ 10 февраля 2019

Создать логическую маску для тестовой строки [edit] на str.contains, затем разделить столбец по пробелу с первым ( или [, заменить несоответствующие значения на NaN на where и заполнить пропущенные значения в столбце A.Функция insert предназначена для нового столбца в первой позиции.Последнее удалите одинаковые значения в обоих столбцах на boolean indexing и создайте индекс по умолчанию на reset_index:

mask = df['Col'].str.contains('[edit]', regex=False)
df['B'] = df.pop('Col').str.split('\s+\(|\s+\[', n=1).str[0]
df.insert(0, 'A', df['B'].where(mask).ffill())
df = df[df['A'] != df['B']].reset_index(drop=True)
print (df)
        A           B
0   Honda      Accord
1   Honda       Civic
2   Honda       Pilot
3  Toyota       Prius
4  Toyota  Highlander
5    Ford    Explorer

Другое решение:

items = []
for x in df['Col']:
    if x.endswith('[edit]'):
        a = x.rstrip(' [edit]')
    else:       
        b = x.split('(')[0].strip()
        items.append((a, b))

df = pd.DataFrame(items, columns=['A', 'B'])
print (df)
        A           B
0   Honda      Accord
1   Honda       Civic
2   Honda       Pilot
3  Toyota       Prius
4  Toyota  Highlander
5     For    Explorer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...