我目前有一个想要压缩的数据集。例如,假设一列为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的新手,在这里找不到答案。
答案 0 :(得分:3)
您可以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]
答案 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])