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

卢莫斯

我有一个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-01
2    0        1           1       2018-01-01    2018-01-01
3    0        1           1       2019-01-01    2019-02-01
4    1        1           0       2018-04-01    2019-03-01
...
n    0        0           1       2017-12-01    2017-12-01
n    0        0           1       2018-03-01    2018-03-01
n    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)

但是不要认为它工作正常。

有办法吗?

耶斯列尔

使用DataFrame.explode在0.25+版本中运行pandas并使用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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

根据列值在pandas DataFrame中重复行

python-根据列中的值重复行x次

根据不同列中的值重复行

SQL选择在一列中具有重复值的不同行,然后根据主键字段中的值为每个重复项选择一行

根据列值重复行N次

根据列中的重复值拆分DataFrame

根据熊猫列中的列表值从DataFrame中选择行

根据列中的值重复行

根据唯一列值重复数据帧行n次,并为每一行重复创建一个具有不同值的新列

如何索引列中具有重复值的行?

SQL查询根据不同的情况将值分配给其他行中具有空值的列

从pyspark数据框中删除具有相同值但在不同列中的重复行

如何选择具有在一列中重复但在另一列中具有不同值的列值的行?

删除特定列中具有特定值的重复行

根据对列中每个不同值具有特定条件的行,在Pandas Dataframe中计算perc

根据时间列中两个值之间的差异,将数据框中的每一行重复N次不同的次数

我想在列和行中具有不同的值。值可以重复,但不能三次

根据具有列表值的多列删除数据框中的重复行

根据列值将具有n行的Series中的值添加到具有m> n行的Dataframe中

删除一列中具有重复值但另一列中具有不同值的行

查找列中具有重复值的行

删除一列中具有重复值但其他列中具有不同值的行

删除两列中具有重复值的行

SQL-根据不同列中的值过滤重复行

尝试根据另一列 SQL 中的 vlue 更新具有不同值的新列的行

如何根据即使只有一个重复项在另一列中具有特定值来删除列的所有重复行

选择可能在不同列中具有重复值的行

使用 R 折叠不同列中具有不同值的重复行

减少列中具有重复值的行,并以不同方式汇总列的其余部分,保持列数