Как реализовать `Год + 1` в Dataframe - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть df

      Date Filing Date Name
0  2013 Q2   8/17/2013  AAA
1  2013 Q3  11/19/2013  BBB
2  2013 Q4    2/2/2014  CCC
3  2014 Q4   2/13/2015  DDD
4  2015 Q1   5/12/2015  EEE
5  2015 Q2    8/7/2015  FFF
6  2015 Q3  11/20/2015  GGG
7  2016 Q4   2/19/2017  HHH
8  2019 Q4    2/4/2020  III

, где я обновляю столбец Filing Date на основе сопоставления:

# Split Date Column into one column for Year, and one for Quarter
df['Year'], df['Quarter'] = df['Date'].str.split(' ', 1).str
# Replace Quarter values with date values
df['Filing Date'] = (df['Quarter'].map({'Q1': '5/15/', 'Q2': '8/15/','Q3': '11/15/', 'Q4': '2/15/'}) + df['Year'])

Проблема в том, что для всех Q4 записей, Year из Filing Date на самом деле должно быть Date Year + 1. Например:

      Date Filing Date Name
2  2013 Q4   2/15/2014  CCC
3  2014 Q4   2/15/2015  DDD
7  2016 Q4   2/15/2017  HHH
8  2019 Q4   2/15/2020  III

Я знаю, что, вероятно, я могу сделать это, преобразовав в dateime, l oop через каждую строку кадра данных и добавив 1 к году для каждой строки Q4. Но это кажется неуклюжим, и я слышал, что лучше избегать циклического перебора данных. Так есть ли более элегантный способ сделать это?

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Вы можете использовать троичный, чтобы увеличить год на единицу, если это Q4: int(yr) + (1 if qtr == 'Q4' else 0)

import datetime as dt

# Sample data.
df = pd.DataFrame({
    'Date': ['2013 Q2', '2013 Q3', '2013 Q4', '2014 Q4', '2015 Q1', '2015 Q2', '2015 Q3', '2016 Q4', '2019 Q4'],
    'Filing Date': ['8/17/2013', '11/19/2013', '2/2/2014', '2/13/2015', '5/12/2015', '8/7/2015', '11/20/2015', '2/19/2017', '2/4/2020'],
    'Name': ['AAA', 'BBB', 'CCC', 'DDD', 'EEE', 'FFF', 'GGG', 'HHH', 'III']
})

# Solution.
quarter_to_month_mapping = {'Q1': 5, 'Q2': 8, 'Q3': 11, 'Q4': 2}
year, quarter = zip(*df['Date'].str.split(' ', 1))
df['Filing Date'] = pd.to_datetime([
    dt.date(
        year=int(yr) + (1 if qtr == 'Q4' else 0), 
        month=quarter_to_month_mapping[qtr], 
        day=15
    ) 
    for yr, qtr in zip(year, quarter)]
)
>>> df
      Date Filing Date Name
0  2013 Q2  2013-08-15  AAA
1  2013 Q3  2013-11-15  BBB
2  2013 Q4  2014-02-15  CCC
3  2014 Q4  2015-02-15  DDD
4  2015 Q1  2015-05-15  EEE
5  2015 Q2  2015-08-15  FFF
6  2015 Q3  2015-11-15  GGG
7  2016 Q4  2017-02-15  HHH
8  2019 Q4  2020-02-15  III
1 голос
/ 18 февраля 2020

Используйте numpy, где , чтобы достичь своей цели:

dic = {'Q1': '5/15/', 'Q2': '8/15/','Q3': '11/15/', 'Q4': '2/15/'}

df['Filing Date'] = np.where(df.Quarter=='Q4', 
                          df['Quarter'].map(dic)+df.Year.add(1).astype(str), 
                          df['Quarter'].map(dic)+df.Year.astype(str))

    Year    Quarter Filing Date Name
0   2013    Q2  8/15/2013   AAA
1   2013    Q3  11/15/2013  BBB
2   2013    Q4  2/15/2014   CCC
3   2014    Q4  2/15/2015   DDD
4   2015    Q1  5/15/2015   EEE
5   2015    Q2  8/15/2015   FFF
6   2015    Q3  11/15/2015  GGG
7   2016    Q4  2/15/2017   HHH
8   2019    Q4  2/15/2020   III
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...