为了账号安全,请及时绑定邮箱和手机立即绑定

在Python中为日期范围内的每年创建新行?

在Python中为日期范围内的每年创建新行?

拉莫斯之舞 2022-09-13 15:14:35
我有一个数据帧,其中每行都有一个年份范围。这是构建它的代码。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   YearsParis     red       2010-2012Rome      orange    2019-2020New York  blue      2015-2018Tokyo     purple    2002-2003我想在“年”范围内为每年创建一个新行。数据帧应如下所示。City    Color   YearsParis     red       2010Paris     red       2011...New York  blue      2018Tokyo     purple    2002Tokyo     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 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

想法是系列.str.拆分列到新的,所以可能重复索引值的差值按年。还用于将每个索引值的所有年份范围相加:DataFrame


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 和列表理解的解决方案,用于多年来范围中的第一个字符和最后一个字符:44


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


查看完整回答
反对 回复 2022-09-13
  • 1 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信