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

根据具有不同列表值的列中的 len(list) 重复 DataFrame 中的行 N 次

根据具有不同列表值的列中的 len(list) 重复 DataFrame 中的行 N 次

慕侠2389804 2022-06-02 15:46:13
我有一个 DataFrame,它看起来像:     col_1    col_2  ...  col_n   date  1    1        0           1       [[2017-02-01, 2017-12-01]]2    0        1           1       [[2018-01-01, 2018-01-01], [2019-01-01, 2019-02-01]]3    1        1           0       [[2018-04-01, 2019-03-01]]...n    0        0           1       [[2017-12-01, 2017-12-01], [2018-03-01, 2018-03-01], [2018-05-01, 2018-05-01], [2018-08-01, 2018-12-01]]而且我需要重复df.date具有多个列表值的列并将它们拆分为新列df.start_date和df.end_date例如     col_1    col_2  ...  col_n   date_start    date_end 1    1        0           1       2017-02-01    2017-12-012    0        1           1       2018-01-01    2018-01-013    0        1           1       2019-01-01    2019-02-014    1        1           0       2018-04-01    2019-03-01...n    0        0           1       2017-12-01    2017-12-01n    0        0           1       2018-03-01    2018-03-01n    0        0           1       2018-05-01    2018-05-01 n    0        0           1       2018-08-01    2018-12-01我试过了date_df['repeat_num'] = [[[row, idx] for idx, item in enumerate(_list)] for row, _list in enumerate(date_df['date'])]for row in range(len(date_df)):    if id_tuple[row][0][1] == 1: np.repeat(date_df.values, 1, axis = 0)    elif id_tuple[row][0][1] == 2: np.repeat(date_df.values, 2, axis = 0)    elif id_tuple[row][0][1] == 3: np.repeat(date_df.values, 3, axis = 0)    elif id_tuple[row][0][1] == 4: np.repeat(date_df.values, 4, axis = 0)    elif id_tuple[row][0][1] == 5: np.repeat(date_df.values, 5, axis = 0)但不要认为它工作正常。有没有办法做到这一点?
查看完整描述

1 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

使用DataFrame.explodepandas 0.25+ 并使用DataFrame构造函数创建新列:


print (date_df)

   a                                               date

0  4       [[2017-02-01 00:00:00, 2017-03-01 00:00:00]]

1  7  [[2017-02-01 00:00:00, 2017-04-01 00:00:00], [...


df = date_df.explode('date')

print (df)

   a                                        date

0  4  [2017-02-01 00:00:00, 2017-03-01 00:00:00]

1  7  [2017-02-01 00:00:00, 2017-04-01 00:00:00]

1  7  [2017-02-01 00:00:00, 2017-04-01 00:00:00]



df[['date_start','date_end']] = pd.DataFrame(df.pop('date').values.tolist(), index=df.index)

print (df)

   a date_start   date_end

0  4 2017-02-01 2017-03-01

1  7 2017-02-01 2017-04-01

1  7 2017-02-01 2017-04-01

编辑:


旧版 pandas 的解决方案:


s = date_df.pop('date')

df = date_df.loc[date_df.index.repeat(s.str.len())]

df[['date_start','date_end']] = pd.DataFrame(np.concatenate(s), index=df.index)

df = df.reset_index(drop=True)

print (df)

   a date_start   date_end

0  4 2017-02-01 2017-03-01

1  7 2017-02-01 2017-04-01

2  7 2017-02-01 2017-04-01


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

添加回答

举报

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