Создайте два столбца на основе одного столбца, но не когда он пуст - PullRequest
0 голосов
/ 30 ноября 2018

Пример фрейма данных:

    id                           col1                      col2
0  Bob       2018-11-29 TO 2018-11-30  2018-12-01 TO 2018-12-31
1  James     2018-10-19 TO 2018-10-31                       NaT
2  Jane      2018-04-05 TO 2018-07-12  2018-11-29 TO 2018-11-30

У меня есть два столбца, в которых диапазоны дат отображаются следующим образом:

"2018-11-29 TO 2018-11-30"

Я успешно извлек каждую дату из первого столбца в два новых столбца, например::

def my_func(data):
    dates = data.split(" TO ")
    dt1 = pd.to_datetime(dates[0].strip(), format="%Y-%m-%d")
    dt2 = pd.to_datetime(dates[1].strip(), format="%Y-%m-%d")
    return (dt1, dt2)

df[["new_col_1", "new_col_2"]] = df.apply(lambda row: pd.Series(my_func(row["col1"])), axis=1)

В «col1» это работало нормально, потому что у каждой строки есть значение.Однако в «col2» не каждая строка имеет значение.Я хочу пропустить эти строки, но это не работает.Я попытался использовать pd.notnull() с условной логикой в ​​лямбда-выражении, но я думаю, что pd.Series() отбрасывает его, и он все равно пытается передать значения, и я продолжаю получать:

AttributeError: ("'float' object has no attribute 'split'", 'occurred at index 0')

Но фактическоеdtype столбцов ("col1" и "col2") - это object (строка), а не с плавающей точкой, поэтому я не уверен, почему он выдает эту ошибку.

Как мне изменить этотак что это работает, но пропускает строки, где этот столбец не имеет значения?

1 Ответ

0 голосов
/ 30 ноября 2018

Нет необходимости в функции самоопределения

#df=pd.DataFrame({'string':["2018-11-29 TO 2018-11-30","2018-11-29 TO 2018-11-30","2018-11-29 TO 2018-11-30"]})
df.string.str.split(' TO ',expand=True).apply(pd.to_datetime)
Out[571]: 
           0          1
0 2018-11-29 2018-11-30
1 2018-11-29 2018-11-30
2 2018-11-29 2018-11-30
#pd.concat([df,df.string.str.split(' TO ',expand=True).apply(pd.to_datetime)],axis=1)

Обновление

df1=df.col1.str.split('TO',expand=True).apply(pd.to_datetime,errors='coerce')
df1.columns=['col1_1', 'col1_2']
df2=df.col2.str.split('TO',expand=True).apply(pd.to_datetime,errors='coerce')
df2.columns=['col2_1', 'col2_2']
pd.concat([df,df1,df2],1)
Out[578]: 
      id                    col1    ...              0          1
0    Bob  2018-11-29TO2018-11-30    ...     2018-12-01 2018-12-31
1  James  2018-10-19TO2018-10-31    ...            NaT        NaT
2   Jane  2018-04-05TO2018-07-12    ...     2018-11-29 2018-11-30
[3 rows x 7 columns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...