Заполните столбец в кадре данных, если выполняется условие - PullRequest
0 голосов
/ 18 декабря 2018

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

PersonID  AmountPaid  PaymentReceivedDate  StartDate withinNYears  
1         100         2017                   2016   
2         20          2014                   2014
1         30          2017                   2016
1         40          2016                   2016
4         300         2015                   2000
5         150         2005                   2002  

Мне нужно, чтобы выплаченная сумма отображалась в столбце withNYears, если платеж был произведен в течение n лет с даты начала, в противном случае вы получите NaN.N лет может быть любым числом, но, скажем, 2 для этого примера (как я буду играть с этим, чтобы увидеть результаты).

, поэтому в основном вышеприведенный кадр данных будет выглядеть так, если сумма была выплачена в течение 2 лет.:

PersonID  AmountPaid  PaymentReceivedDate  StartDate  withinNYears  
1         100         2017                   2016     100
2         20          2014                   2014     20
1         30          2017                   2016     30 
1         40          2016                   2016     40
4         300         2015                   2000     NaN
5         150         2005                   2002     NaN

Кто-нибудь знает, как этого добиться?веселит.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Просто сделайте с назначением, используя loc

df.loc[(df['PaymentReceivedDate'] - df['StartDate']<2),'withinNYears']=df.AmountPaid
df
Out[37]: 
   PersonID  AmountPaid      ...       StartDate  withinNYears
0         1         100      ...            2016         100.0
1         2          20      ...            2014          20.0
2         1          30      ...            2016          30.0
3         1          40      ...            2016          40.0
4         4         300      ...            2000           NaN
5         5         150      ...            2002           NaN
[6 rows x 5 columns]
0 голосов
/ 18 декабря 2018

Вычтите столбцы и сравните по скаляру для логической маски, а затем установите значение на numpy.where, Series.where или DataFrame.loc:

m = (df['PaymentReceivedDate'] - df['StartDate']) < 2
df['withinNYears'] = np.where(m, df['AmountPaid'], np.nan)
#alternatives
#df['withinNYears'] = df['AmountPaid'].where(m)
#df.loc[m, 'withinNYears'] = df['AmountPaid']

print (df)
   PersonID  AmountPaid  PaymentReceivedDate  StartDate   \
0         1         100                 2017                    2016   
1         2          20                 2014                    2014   
2         1          30                 2017                    2016   
3         1          40                 2016                    2016   
4         4         300                 2015                    2000   
5         5         150                 2005                    2002   

   withinNYears  
0         100.0  
1          20.0  
2          30.0  
3          40.0  
4           NaN  
5           NaN

РЕДАКТИРОВАТЬ:

Если столбец StartDate имеет datetime:

m = (df['PaymentReceivedDate'] - df['StartDate'].dt. year) < 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...