如何在 Pandas 中将日期列和相关列一起取消嵌套?

Posted

技术标签:

【中文标题】如何在 Pandas 中将日期列和相关列一起取消嵌套?【英文标题】:How to unnest a date column and a related column together in Pandas? 【发布时间】:2021-10-14 18:02:40 【问题描述】:

我有一个包含两列的数据框,我想一起爆炸/取消嵌套。一个包含日期,另一个包含与日期相关的信息。

这是最初的 df 的样子:

data = [
    ["ABC", 2002, ["AB", "AB", "EF"], ["2002-05-06", "2002-05-07", "2002-05-12"]],
    ["DEF", 2002, [["CD", "EF"]], ["2002-06-12", "2002-06-13"]],
    ["GHI", 2002, [["JK"]], ["2002-03-02"]],
    ["JKL", 2002, [[]], ["2002-03-02"]],
]

df = pd.DataFrame(data, columns=["ID", "year", "list", "date_list"])
df

想要它喜欢的是,日期变量和相关列表元素被解包在一起:

data = [
    ["ABC", 2002, ["AB"], ["2002-05-06"]],
    ["ABC", 2002, ["AB"], ["2002-05-07"]],
    ["ABC", 2002, ["EF"], ["2002-05-12"]],
    ["DEF", 2002, ["CD"], ["2002-06-12"]],
    ["DEF", 2002, ["EF"], ["2002-06-13"]],
    ["GHI", 2002, [["JK"]], ["2002-03-02"]],
    ["JKL", 2002, [[]], ["2002-03-02"]],
]

df = pd.DataFrame(data, columns=["ID", "year", "list", "date_list"])
df

我曾尝试单独和单独地爆炸 listdate_list 列,但我不知道有一种方法可以将它们以有序的方式解除嵌套。有人知道怎么做吗?

【问题讨论】:

【参考方案1】:

如果我理解正确的话:

extracted = df['list'].explode().to_frame().reset_index(drop=True).join(df['date_list'].explode().reset_index())
df = df[['ID', 'year']].merge(extracted[['list', 'date_list', 'index']], left_index=True, right_on='index').drop(columns=['index'])

输出:

    ID  year list   date_list
0  ABC  2002   AB  2002-05-06
1  ABC  2002   AB  2002-05-07
2  ABC  2002   EF  2002-05-12
3  DEF  2002   CD  2002-06-12
4  DEF  2002   EF  2002-06-13
5  GHI  2002   JK  2002-03-02
6  JKL  2002  NaN  2002-03-02

【讨论】:

我用图片更新了问题,以显示输出数据集的所需格式。希望这能解决问题! 检查编辑后的答案。

以上是关于如何在 Pandas 中将日期列和相关列一起取消嵌套?的主要内容,如果未能解决你的问题,请参考以下文章

将日期列和时间列合并到日期时间

pandas将dataframe中日期字符串数据列和时间字符串数据列合并成完整时间字符串并使用to_datetime将字符串格式转化为时间格式

如何在 Python/Pandas 中将变量设置为“今天”日期

如何在 Flutter 中将列和行项居中?

合并 Pandas Dataframe:如何添加列和替换值

Pandas 更快地将 pd.pct_change 应用于多个列和多个间隔