2016-11-09 3 views
0

Я пытаюсь создать новые столбцы на основе диапазона дат, чтобы узнать, сколько EMI тратится в месяц за каждую запись. В питона, пожалуйста, сообщите о том, как это можно сделатьСоздание новых столбцов на основе существующих значений в Python

входного файла

Start Date End Date EMI 
01/12/16 01/12/17 4800 
09/01/16 09/01/17 3000 
01/07/15 01/05/16 2300 

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

Start Date End Date  EMI 06/16 07/16 08/16 09/16 10/16 11/16 12/16 01/17 02/17 
01/12/16 01/12/17 4800 4800 4800 4800 4800 4800 4800 4800 4800 0 
09/01/16 09/01/17 3000 0  0  0  3000 3000 3000 3000 3000 3000 
01/07/15 01/05/16 2300 0  0  0  0  0  0  0  0  0 

Пожалуйста скажите мне ваши предложения по реализации этого с помощью питона ,

+2

Я совершенно запутался! Как вы попали в столбцы на выходе? Что определяет значения? – piRSquared

+0

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

ответ

0

IIUC вам нужно:

#reshape datetime columns to one, create datetimeindex 
df1 = pd.melt(df.reset_index(), id_vars=['EMI', 'index'], value_name='date') 
     .set_index('date') 
#convert index to periodindex by month 
df1.index = pd.to_datetime(df1.index, format='%d/%m/%y', errors='coerce') 
       .to_period('M') 
#groupby by column index nad resample by month 
df1 = df1.groupby('index') 
     .resample('M') 
     .ffill() 
     .drop(['variable', 'index'], axis=1) 
     .reset_index() 
#pivoting, fill NaN with 0, cast floats to int 
df1 = df1.pivot(index='index', columns='date', values='EMI') 
     .fillna(0) 
     .astype(int) 
#change format of columns 
df1.columns = df1.columns.strftime('%m/%y') 
#concat original dataframe 
df = pd.concat([df,df1], axis=1) 

print (df) 
    Start Date End Date EMI 07/15 08/15 09/15 10/15 11/15 12/15 01/16 \ 
0 01/12/16 01/12/17 4800  0  0  0  0  0  0  0 
1 09/01/16 09/01/17 3000  0  0  0  0  0  0 3000 
2 01/07/15 01/05/16 2300 2300 2300 2300 2300 2300 2300 2300 

    03/17 04/17 05/17 06/17 07/17 08/17 09/17 10/17 11/17 12/17 
0 ...  4800 4800 4800 4800 4800 4800 4800 4800 4800 4800 
1 ...  0  0  0  0  0  0  0  0  0  0 
2 ...  0  0  0  0  0  0  0  0  0  0 

[3 rows x 33 columns] 
+0

Можете ли вы проверить мое решение? '01/12/16' -' DDMMYY' или 'MMDDYY'? – jezrael

+0

Формат даты MMDDYY Я сделал это изменение в выражении 'df1.index = pd.to_datetime (df1.index, format = '% d /% m /% y', errors = 'coerce')' –

+0

Также, когда я я выполняю этот кусок кода, который он выполнял в течение 3 часов, мой общий размер файла - всего 180 МБ 'df1 = df1.groupby ('index') .resample ('M') .ffill() .drop ([' variable ',' index '], axis = 1) .reset_index() ' –

Смежные вопросы