2016-11-07 4 views
1

Я пытаюсь отформатировать данные одного столбца. Я могу найти варианты разделения столбцов, поскольку между ними есть ,, но я не могу отформатировать его, как показано на выходе.Разделить столбцы и форматировать значения столбцов

Входной

TITLE,Issn 
NATURE REVIEWS MOLECULAR CELL BIOLOGY,"ISSN 14710072, 14710080" 
ANNUAL REVIEW OF IMMUNOLOGY,"ISSN 07320582, 15453278" 
NATURE REVIEWS GENETICS,"ISSN 14710056, 14710064" 
CA - A CANCER JOURNAL FOR CLINICIANS,"ISSN 15424863, 00079235" 
CELL,"ISSN 00928674, 10974172" 
ANNUAL REVIEW OF ASTRONOMY AND ASTROPHYSICS,"ISSN 15454282, 00664146" 
NATURE REVIEWS IMMUNOLOGY,"ISSN 14741741, 14741733" 
NATURE REVIEWS CANCER,ISSN 1474175X 
ANNUAL REVIEW OF BIOCHEMISTRY,"ISSN 15454509, 00664154" 
REVIEWS OF MODERN PHYSICS,"ISSN 00346861, 15390756" 
NATURE GENETICS,ISSN 10614036 
  1. Split столбец ISSN в две колонки, как это имеет ,
  2. Исключить слово ISSN из колонки только
  3. оставить позади чисел После 4-х цифр положить -

Ожидаемый результат:

TITLE,Issn 
NATURE REVIEWS MOLECULAR CELL BIOLOGY,1471-0072, 1471-0080 
ANNUAL REVIEW OF IMMUNOLOGY,0732-0582, 1545-3278 
NATURE REVIEWS GENETICS,1471-0056, 1471-0064 
CA - A CANCER JOURNAL FOR CLINICIANS,1542-4863, 0007-9235 
CELL,0092-8674, 1097-4172 
ANNUAL REVIEW OF ASTRONOMY AND ASTROPHYSICS,1545-4282, 0066-4146 
NATURE REVIEWS IMMUNOLOGY,1474-1741, 1474-1733 
NATURE REVIEWS CANCER, 1474-175X 
ANNUAL REVIEW OF BIOCHEMISTRY,1545-4509, 0066-4154 
REVIEWS OF MODERN PHYSICS,0034-6861, 1539-0756 
NATURE GENETICS,1061-4036 

Любое предложение с пандами оценили .. Спасибо заранее

Update:
При попытке запустить обе программы, как указано в ответе

import pandas as pd 
import re 

df = pd.read_csv('new_journal_list.csv', header='TITLE,Issn') 

''' 
df_split_num = df['Issn'].map(lambda x: x.split('ISSN ')[1].split(', ')) 
df_dash_num = df_split_num.map(lambda x: [num[:4] + '-' + num[4:] for num in x]) 

df_split_issn = pd.DataFrame(data=list(df_dash_num), columns=['Issn1', 'Issn2']) 
df[['Issn1', 'Issn2']] = df_split_issn 
del df['Issn'] 

print df 

''' 

df[['Issn1','Issn2']] = (df.pop('Issn').str.extract('ISSN\s+([^,]+),?\s?(.*)', expand=True) 
        .apply(lambda x: x.str[:4]+'-'+x.str[4:]).replace(r'^-$', '', regex=True)) 

print df 

или случаи, когда выполняются в default python 2.7 Я получаю следующую ошибку

Traceback (most recent call last): 
    File "clean_journal_list.py", line 1, in <module> 
    import pandas as pd 
    File "/usr/local/lib/python2.7/dist-packages/pandas/__init__.py", line 25, in <module> 
    from pandas import hashtable, tslib, lib 
    File "pandas/src/numpy.pxd", line 157, in init pandas.hashtable (pandas/hashtable.c:38364) 
44445 +16410617451515053691368888

При запуске в Python 3.4 ниже данная ошибка рассматривается

File "clean_journal_list.py", line 21 
    print df 
     ^
SyntaxError: invalid syntax 
+0

могли бы вы опубликовать свои данные в качестве выходных 'печати (df.to_csv())' - потому что трудно разобрать его ... – MaxU

+0

Да, я могу .. .. –

+1

@MaxU Выполнено изменение ввода на csv .. –

ответ

1

Сначала разделите цифры и добавьте тире к ним. Используйте функцию удобной карты:

df_split_num = df['Issn'].map(lambda x: x.split('ISSN ')[1].split(', ')) 
df_dash_num = df_split_num.map(lambda x: [num[:4] + '-' + num[4:] for num in x]) 

Далее создайте новый фрейм данных с расколом из числа тек- и поместить его обратно в исходный кадр данных:

df_split_issn = pd.DataFrame(data=list(df_dash_num), columns=['Issn1', 'Issn2']) 
df[['Issn1', 'Issn2']] = df_split_issn 
del df['Issn'] 
+0

не могли бы вы проверить обновленный вход и выход. не более столбца –

+1

Я предполагаю, что ваш ввод - это dataframe. Если Rank не является индексом, вам просто нужно сбросить строки reset_index и set_index выше. – jagdish

+0

Да Ранг не нужен в фрейме данных, не могли бы вы отредактировать код. –

1

Вы хотите добавить обработку ошибок к этому, и завернуть его в итерации строка за строкой, но вот суть его :

leader, issns = line.split(" ISSN ") 
numbers = issns.split(", ") 

print leader, ', '.join([ num[:4] + '-' + num[4:] for num in numbers]) 

Главное, чтобы разделить каждую строку в «номер ISSN» и «все остальное», а затем отделить число ISSN друг от друга и переформатировать их.

+0

Спасибо .. позвольте мне попробовать .. –

2

IIUC вы можете сделать это с помощью Series.str.extract() , apply() и replace() методы:

In [33]: df 
Out[33]: 
              TITLE      Issn 
0   NATURE REVIEWS MOLECULAR CELL BIOLOGY ISSN 14710072, 14710080 
1     ANNUAL REVIEW OF IMMUNOLOGY ISSN 07320582, 15453278 
2      NATURE REVIEWS GENETICS ISSN 14710056, 14710064 
3   CA - A CANCER JOURNAL FOR CLINICIANS ISSN 15424863, 00079235 
4           CELL ISSN 00928674, 10974172 
5 ANNUAL REVIEW OF ASTRONOMY AND ASTROPHYSICS ISSN 15454282, 00664146 
6      NATURE REVIEWS IMMUNOLOGY ISSN 14741741, 14741733 
7       NATURE REVIEWS CANCER   ISSN 1474175X 
8     ANNUAL REVIEW OF BIOCHEMISTRY ISSN 15454509, 00664154 
9      REVIEWS OF MODERN PHYSICS ISSN 00346861, 15390756 
10        NATURE GENETICS   ISSN 10614036 

In [34]: df[['Issn1','Issn2']] = (df.pop('Issn') 
    ...:       .str.extract('ISSN\s+([^,]+),?\s?(.*)', expand=True) 
    ...:       .apply(lambda x: x.str[:4]+'-'+x.str[4:]) 
    ...:       .replace(r'^-$', '', regex=True)) 
    ...: 

In [35]: df 
Out[35]: 
              TITLE  Issn1  Issn2 
0   NATURE REVIEWS MOLECULAR CELL BIOLOGY 1471-0072 1471-0080 
1     ANNUAL REVIEW OF IMMUNOLOGY 0732-0582 1545-3278 
2      NATURE REVIEWS GENETICS 1471-0056 1471-0064 
3   CA - A CANCER JOURNAL FOR CLINICIANS 1542-4863 0007-9235 
4           CELL 0092-8674 1097-4172 
5 ANNUAL REVIEW OF ASTRONOMY AND ASTROPHYSICS 1545-4282 0066-4146 
6      NATURE REVIEWS IMMUNOLOGY 1474-1741 1474-1733 
7       NATURE REVIEWS CANCER 1474-175X 
8     ANNUAL REVIEW OF BIOCHEMISTRY 1545-4509 0066-4154 
9      REVIEWS OF MODERN PHYSICS 0034-6861 1539-0756 
10        NATURE GENETICS 1061-4036 
+0

. Пожалуйста, ознакомьтесь с разделом обновления в вопросе –