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