Python 基于列中具有不同列表值的len(list),在数据帧中重复N次行

Python 基于列中具有不同列表值的len(list),在数据帧中重复N次行,python,pandas,date,dataframe,Python,Pandas,Date,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,

我有一个数据框,看起来像:

     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\u date
df.end\u date

e、 g

我试过了

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)
但我不认为它工作正常

有办法吗?

使用pandas 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
编辑:

旧版本的解决方案:

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

Wiith
pd.explode()
i将列表中的每个元素转换为具有相同值的行,然后创建两列并使用
pd.pop()删除
pf.date
。但是它是如何被
date\u start
date\u end
分割的呢?@Doppie-添加了
explode
函数的输出-它返回一个由重复行成对填充的列,最后一个
DataFrame
构造函数将列表转换为2列,但是在pandas 0.23上除了
pd.explode
之外还有其他选项吗?@Doppie-当然,给我点时间。
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