在python中创建简短表,并在列中列出列表

时间:2019-03-15 16:05:37

标签: python pandas

我目前有一个想要压缩的数据集。例如,假设一列为mother,另一列为child。母亲可能有一个以上的孩子,但每个孩子只有一个母亲。因此,在我的理想输出中,每个母亲将有一行,母亲是一列,孩子是另一列。我当前的数据是每个孩子一行,母亲重复。

基于这个非常有用的blog post,我可以在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数据框单元格中有一个列表,但是我不确定如何操纵现有数据来产生此列表。也许熊猫不是正确的选择,但看起来应该是。

这是我目前的数据框架:

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

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

2 个答案:

答案 0 :(得分:3)

您可以GroupBymother并使用','作为分隔符与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] 

答案 1 :(得分:0)

您也可以尝试此枢轴解决方案。这将创建一个数据框,并在不同的列中显示孩子的名字

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


df_group1 = df.pivot(index  = 'mother', values = 'child', columns = 'child').reset_index()
df_group1.columns = range(df_group1.shape[1])