python numpy создать столбец набора данных: только добавить значение на основе условия, в противном случае ноль - PullRequest
3 голосов
/ 09 января 2020

Я пытаюсь создать дату окончания столбца. Но только если для флага отмены или пропусков установлено значение yes, дата окончания столбца должна содержать дату вступления в силу, в противном случае - ноль. Я получаю следующее сообщение об ошибке для этих трех подходов.

df['Termination_Date'] = np.where((df['Cancellations'] == 'Yes') | (df['Lapses'] == 'Yes'), df['Effective Date'])
ValueError: either both or neither of x and y should be given

df['Termination_Date'] = np.where((df['Cancellations'] == 'Yes') | (df['Lapses'] == 'Yes'), df['Effective Date'], "")
TypeError: invalid type promotion

df['Termination_Date'] = np.where((df['Cancellations'] == 'Yes') | (df['Lapses'] == 'Yes'), df['Effective Date'], np.nan)
TypeError: invalid type promotion

спасибо

Ответы [ 3 ]

2 голосов
/ 09 января 2020

Использование Series.where:

df['Termination_Date'] = df['Effective Date'].where( (df['Cancellations'] == 'Yes') |
                                                     (df['Lapses'] == 'Yes') )

или Series.mask

df['Termination_Date'] = df['Effective Date'].mask( df['Cancellations'].ne('yes')
                                              .mul(df['Lapses'].ne('Yes') )

Также мы можем проверить с DataFrame.any

df['Termination_Date'] = df['Effective Date'].where( df[['Lapses','Cancellations']].eq('Yes').any(axis = 1) )
2 голосов
/ 09 января 2020

Возможно использование альтернативы с Series.where?

Образец :

df = pd.DataFrame({
         'Effective Date':pd.date_range('2019-01-01', periods=6),
         'Cancellations':['Yes'] * 4 + ['No'] * 2,
         'Lapses':['yes'] * 2 + ['No'] * 4,

})

df['Termination_Date'] = df['Effective Date'].where((df['Cancellations'] == 'Yes') | 
                                                     (df['Lapses'] == 'Yes')) 

Или:

m = (df['Cancellations'] == 'Yes') | (df['Lapses'] == 'Yes')
df.loc[m, 'Termination_Date'] = df['Effective Date']

print (df)
  Effective Date Cancellations Lapses Termination_Date
0     2019-01-01           Yes    yes       2019-01-01
1     2019-01-02           Yes    yes       2019-01-02
2     2019-01-03           Yes     No       2019-01-03
3     2019-01-04           Yes     No       2019-01-04
4     2019-01-05            No     No              NaT
5     2019-01-06            No     No              NaT
0 голосов
/ 09 января 2020

Вы можете использовать .lo c для индексации:

df = pd.DataFrame({'Effective_Date':pd.date_range('2019-01-01', periods = 6),
               'Cancellations':['Yes'] * 4 + ['No'] * 2,
               'Lapses':['Yes'] * 2 + ['No'] * 4})

df
    Effective_Date  Cancellations   Lapses
0   2019-01-01      Yes             Yes
1   2019-01-02      Yes             Yes
2   2019-01-03      Yes             No
3   2019-01-04      Yes             No
4   2019-01-05      No              No
5   2019-01-06      No              No

df["Termination_Date"] = df.loc[(df["Cancellations"] == "Yes") | (df["Lapses"] == "Yes"), "Effective_Date"]

    Effective_Date  Cancellations   Lapses  Termination_Date
0   2019-01-01      Yes             Yes     2019-01-01
1   2019-01-02      Yes             Yes     2019-01-02
2   2019-01-03      Yes             No      2019-01-03
3   2019-01-04      Yes             No      2019-01-04
4   2019-01-05      No              No      NaT
5   2019-01-06      No              No      NaT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...