Python 3 Создание столбца на основе переменных из других столбцов - PullRequest
0 голосов
/ 03 октября 2018

У меня есть набор данных, в котором указан год, месяц и день недели.Однако в нем отсутствует фактический день месяца (т. Е. С 1 по 30 день).Набор данных выглядит следующим образом:

#   Year    Month   Day_Of_Week
22024   2002    January Tuesday
22101   2002    January Wednesday
22146   2002    January Thursday
22201   2002    January Friday
22247   2002    January Saturday
22280   2002    January Sunday
22335   2002    January Monday
22383   2002    January Tuesday
22384   2002    January Wednesday
22424   2002    January Thursday
22459   2002    January Friday
22511   2002    January Saturday
22598   2002    January Sunday
22599   2002    January Monday
22686   2002    January Tuesday
22687   2002    January Wednesday
22688   2002    January Wednesday
22689   2002    January Wednesday
22761   2002    January Wednesday
22762   2002    January Wednesday
22763   2002    January Wednesday
22764   2002    January Wednesday
22765   2002    January Thursday
22766   2002    January Thursday
22767   2002    January Thursday
22768   2002    January Thursday
22814   2002    January Friday
22815   2002    January Friday
22816   2002    January Friday
22817   2002    January Friday
22818   2002    January Friday

Логика определения дня очень проста.Первая запись в таблице относится к 1-му дню. Вторая запись относится к 2-му дню, и мы увеличиваем количество дней, когда "Day_Of_Week" изменяется по сравнению с предыдущей записью.Когда месяц «январь», мы считаем 31 день, «февраль» - 28 дней и т. Д.

Используя панд, я хочу создать новый столбец с именем «Crash_Day».Как я могу перебрать записи и заполнить свои записи в моем новом столбце, следуя моей логике выше?

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

Это мой код до сих пор

import pandas as pd

crash_data = pd.read_csv('data.csv')
print('Length: {} rows.'.format(len(crash_data)))
print(crash_data.head())

Если кому-то интересно посмотреть на данные, то это по следующей ссылке: Данные

1 Ответ

0 голосов
/ 03 октября 2018

Если все даты являются последовательными и между ними нет пропусков, возможно использование лямбда-функции со сравнением shift отредактированных значений по ne (!=) для запусковкаждое последующее значение, а затем используйте cumsum для counter:

df['day'] = (df.groupby(['Year','Month'])['Day_Of_Week']
               .transform(lambda x: x.ne(x.shift()).cumsum()))

Альтернативное решение:

s = df['Day_Of_Week'].ne(df['Day_Of_Week'].shift())
df['day'] = s.groupby([df['Year'],df['Month']]).cumsum().astype(int)

print (df)
       Year     Month Day_Of_Week  day
22024  2002   January     Tuesday    1
22101  2002   January   Wednesday    2
22146  2002   January    Thursday    3
22201  2002   January      Friday    4
22247  2002   January    Saturday    5
22280  2002   January      Sunday    6
22335  2002   January      Monday    7
22383  2002   January     Tuesday    8
22384  2002   January   Wednesday    9
22424  2002   January    Thursday   10
22459  2002   January      Friday   11
22511  2002   January    Saturday   12
22598  2002   January      Sunday   13
22599  2002   January      Monday   14
22686  2002   January     Tuesday   15
22687  2002   January   Wednesday   16
22688  2002   January   Wednesday   16
22689  2002   January   Wednesday   16
22761  2002   January   Wednesday   16
22762  2002   January   Wednesday   16
22763  2002   January   Wednesday   16
22764  2002   January   Wednesday   16
22765  2002   January    Thursday   17
22766  2002   January    Thursday   17
22767  2002   January    Thursday   17
22768  2002   January    Thursday   17
22814  2002   January      Friday   18
22815  2002   January      Friday   18
22816  2002   January      Friday   18
22817  2002   January      Friday   18
22818  2002   January      Friday   18
22817  2002  February   Wednesday    1
22818  2002  February   Wednesday    1
...