Назначьте NaN столбцу на основе другого столбца - PullRequest
0 голосов
/ 29 мая 2020

Название может немного отличаться. Я объясню это как следует. Я получаю DataFrame df с неожиданным форматом одного из столбцов с именем marker.

Иногда я получаю marker, смешанный из одного marker или диапазона marker:

marker             place1       place2
45                  PQR           STU
145.0-100           ABC           DEF
267.0-175.8         GHI           KLM

Во время преобразования мне нужно разделить marker, который содержит -, и он станет таким:

marker        firstkm    lastkm    place1       place2
45             45         NaN       PQR           STU
145.0-100      145.0      100       ABC           DEF
267.0-175.8    267.0      175.8     GHI           KLM

Я также могу получить следующий DataFrame, где все marker - это не диапазон.

marker    place1       place2
145.0      ABC           DEF
267.0      GHI           KLM

С помощью этого фрагмента кода:

    #Split marker to temporary dataframe , split_m
    split_m = df.marker.str.split('-', expand=True)
    split_m.columns=['firstkm', 'lastkm'] #hitting error here
    split_m = split_km[['firstkm', 'lastkm']].replace([None], np.nan)

я могу достичь желаемого результата, если DataFrame будет похож на первый пример, который я показал выше. Однако я не могу добиться результата, если DataFrame похож на второй показанный мной пример. Я получаю сообщение об ошибке:

ValueError: Несоответствие длины: ожидаемая ось имеет 1 элемент, новые значения имеют 2 элемента

Я понимаю, что ошибка вызвана невозможностью DataFrame поставить любое значение в lastkm. Но я не знаю, как с этим справиться ..

Если я напечатаю split_m для второго DataFrame, я получу следующее:

marker     firstkm    
145.0       145.0
267.0       267.0

Как я могу назначить np.nan сразу на lastkm, чтобы получить следующий результат:

marker     firstkm   lastkm  
145.0       145.0     NaN
267.0       267.0     NaN

EDIT

Другой шаблон, с которым я сталкиваюсь:

marker        firstkm      lastkm    place1       place2
45             45           NaN       PQR           STU
145.0-100      145.0        100       ABC           DEF
267.0-175.8    267.0        175.8     GHI           KLM
18.1J          18.1J        Nan       GHI           KLM
P7.991-54.3    P7.991       54.3      GHI           KLM
UPM Ex 0.5     UPM Ex 0.5   NaN       PPP           SSS

UPMEx0.5 все еще приемлемо. Без учета регистра.

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Вы можете попробовать это:

# create a copy of the original df, split_m
split_m = df.copy()

# create the additional required columns with default 'NaN' values
split_m.insert(1, 'firstkm', np.nan)
split_m.insert(2, 'lastkm', np.nan)

# unpack the splitted values to the columns. If nothing to unpack
# for 'lastkm', it will become None
split_m[['firstkm', 'lastkm']] = df.marker.str.split('-', expand=True)
# fill None values with np.nan
split_m.fillna(np.nan, inplace=True)

print(split_m)

Вывод:

        marker firstkm lastkm place1 place2
0           45      45    NaN    PQR    STU
1    145.0-100   145.0    100    ABC    DEF
2  267.0-175.8   267.0  175.8    GHI    KLM
3        145.0   145.0    NaN    ABC    DEF
4        267.0   267.0    NaN    GHI    KLM

Новый сценарий с измененным вводом:

# tab separated data for read_clipboard()
# please make sure that you source data 
# has a separator other than space.
'''
marker  place1  place2
45  PQR STU
145.0-100   ABC DEF
267.0-175.8 GHI KLM
145.0   ABC DEF
267.0   GHI KLM
P7.991-54.3 GHI KLM
UPM Ex 0.5  PPP SSS
'''

import pandas as pd
import numpy as np

df = pd.read_clipboard()

# #Split marker to temporary dataframe , split_m
split_m = df.copy()

# create the additional required columns with default 'NaN' values
split_m.insert(1, 'firstkm', np.nan)
split_m.insert(2, 'lastkm', np.nan)

# unpack the splitted values to the columns. If nothing to unpack
# for 'lastkm', it will become None
split_m[['firstkm', 'lastkm']] = df.marker.str.split('-', expand=True)
split_m.fillna(np.nan, inplace=True)

print(split_m)

Вывод:

        marker     firstkm lastkm place1 place2
0           45          45    NaN    PQR    STU
1    145.0-100       145.0    100    ABC    DEF
2  267.0-175.8       267.0  175.8    GHI    KLM
3        145.0       145.0    NaN    ABC    DEF
4        267.0       267.0    NaN    GHI    KLM
5  P7.991-54.3      P7.991   54.3    GHI    KLM
6   UPM Ex 0.5  UPM Ex 0.5    NaN    PPP    SSS
0 голосов
/ 29 мая 2020

Используйте str.extract:

print (df["marker"].str.extract("(?P<Start>\d+\.?\d+?)-?(?P<End>\d+\.?\d+?)?"))

   Start    End
0     45    NaN
1  145.0    100
2  267.0  175.8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...