首页 > 解决方案 > 在python中创建短而窄的表,列中有列表

问题描述

我目前有一个要压缩的数据集。例如,假设一列是 ,另一列motherchild。母亲可能有不止一个孩子,但每个孩子只有一个母亲。所以在我的理想输出中,每个母亲会有一行,母亲是一列,孩子的列表是另一列。我当前的数据改为每个孩子一行,母亲重复。

根据这篇非常有用的博客文章,我可以在 R 中做到这一点。例如:

library(data.table)
dt <- data.table(mother = c("Penny", "Penny", "Anya", "Sam", "Sam", "Sam"), 
                 child = c("Violet", "Prudence", "Erika", "Jake", "Wolf", "Red"))
dt[, children := .(list(unique(child))), by = mother]
dt[, child := NULL]
dt <- unique(dt, by = "mother")

我的输出如下所示:

   mother        children
1:  Penny        Violet,Prudence
2:  Anya         Erika
3:  Sam          Jake,Wolf,Red

但是,我正在使用 Python 和 pandas 一起工作,但我想不出等效的东西。我可以看到在 pandas 数据框单元格中可以有一个列表,但我不确定如何操作现有数据来生成它。也许 pandas 不是正确使用的东西,但它似乎是正确的。

这是我的数据框:

import pandas as pd
data = {'mother':["Penny", "Penny", "Anya", "Sam", "Sam", "Sam"],'child':["Violet", "Prudence", "Erika", "Jake", "Wolf", "Red"]}
df = pd.DataFrame(data)

抱歉,如果这是基本的 - 我是 Python 新手,在这里找不到答案。

标签: pythonpandas

解决方案


您可以使用作为分隔符GroupBy的列mother和聚合:join','

df.groupby('mother').agg(','.join).reset_index()

   mother        child
0   Anya            Erika
1  Penny  Violet,Prudence
2    Sam    Jake,Wolf,Red

对于列表而不是字符串,您可以执行以下操作:

df.groupby('mother').child.apply(list).reset_index()

   mother           child
0   Anya             [Erika]
1  Penny  [Violet, Prudence]
2    Sam   [Jake, Wolf, Red] 

推荐阅读