Создание новой строки для каждого года в диапазоне дат в Python? - PullRequest
3 голосов
/ 24 марта 2020

У меня есть датафрейм, где каждая строка имеет диапазон лет. Это код для его построения.

original = pd.DataFrame({'City': ['Paris','Rome','New York', 'Tokyo'], 'Color': ['red', 'orange', 'blue', 'purple'], 'Years': ['2010-2012', '2019-2020', '2015-2018', '2002-2003']})

Таблица выглядит примерно так:

City    Color   Years
Paris     red       2010-2012
Rome      orange    2019-2020
New York  blue      2015-2018
Tokyo     purple    2002-2003

Я хочу создать новую строку для каждого года в диапазоне 'Years' , Фрейм данных должен выглядеть следующим образом.

City    Color   Years
Paris     red       2010
Paris     red       2011
...
New York  blue      2018
Tokyo     purple    2002
Tokyo     purple    2003

Это код, который я сейчас использую. Я пытаюсь добавить новую строку для каждого года, но она возвращает только пустой фрейм данных, и я не знаю, почему.

df_empty = pd.DataFrame({'City': [], 'Color': [], 'Years': []})

for index, row in original.iterrows():
    dates = [int(s) for s in row['Years'].split("-") if s.isdigit()]
    for i in range(dates[0],dates[1] + 1):
        newrow = row
        newrow.append(pd.Series([str(i)]))
        df_empty.add(newrow)

1 Ответ

4 голосов
/ 24 марта 2020

Идея - это Series.str.split столбцов для новых DataFrame, поэтому возможно повторение значений индекса по разнице по годам. Также используется GroupBy.cumcount для добавления всех диапазонов лет для значений индекса:

df = original['Years'].str.split('-', expand=True).astype(int)
original['Years'] = df[0]
df = original.loc[original.index.repeat(df[1] - df[0] + 1)]
df['Years'] += df.groupby(level=0).cumcount()
df = df.reset_index(drop=True)
print (df)
        City   Color  Years
0      Paris     red   2010
1      Paris     red   2011
2      Paris     red   2012
3       Rome  orange   2019
4       Rome  orange   2020
5   New York    blue   2015
6   New York    blue   2016
7   New York    blue   2017
8   New York    blue   2018
9      Tokyo  purple   2002
10     Tokyo  purple   2003

Другое решение с DataFrame.explode и списком для первых диапазонов 4 и последние 4 символов для лет:

original['Years'] = [[y for y in range(int(x[:4]), int(x[-4:]) + 1)] 
                        for x in original['Years']]

original = original.explode('Years').reset_index(drop=True)
print (original)
        City   Color Years
0      Paris     red  2010
1      Paris     red  2011
2      Paris     red  2012
3       Rome  orange  2019
4       Rome  orange  2020
5   New York    blue  2015
6   New York    blue  2016
7   New York    blue  2017
8   New York    blue  2018
9      Tokyo  purple  2002
10     Tokyo  purple  2003
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...