2016-09-18 87 views
3

前缀列表,我有一个CSV文件看起来像这样:熊猫GROUPBY所有列添加到列名

id1,feat1,feat2,feat3 
a,b,asd,asg 
c,d,dg,ag 
a,e,sdg,as 
c,f,as,sdg 
c,g,adg,sd 

我到一个数据帧与df = pd.read_csv("file.csv")阅读。

我想按id1分组,并将组中的所有其他列合并到一个行中,并将头名添加为前缀。这是输出应该是一个数据帧,看起来像:

a [feat1=b,feat1=e,feat2=asd,feat2=sdg,feat3=asg,feat3=as] 
c [feat1=d,feat1=f,feat1=g,feat2=dg,feat2=as,feat2=adg,feat3=ag,feat3=sdg,feat3=sd] 

df.groupby('id1')将开始我了,但我不知道从哪里里去。

这样做的好方法是什么?

+1

为什么我正确undestood它,你想有一个DF,其中第二列将如下所示:'['feat1 = b','feat1 = e',...]'? – MaxU

+0

@MaxU是的。 – eleanora

回答

2

可以使用groupby对象上的自定义功能和apply,功能再次呼吁apply的系列传递给列名和值压缩到一个列表,我们再进行一个列表理解并返回该列表作为内期望:

In [54]:  
def foo(x): 
    l = (x.apply(lambda x: x.name + '=' + x)).values.tolist() 
    return pd.Series([[i for j in l for i in j]]) 
​ 
gp = df.groupby('id1')[['feat1','feat2','feat3']] 
gp1 = gp.apply(foo) 
gp1 

Out[54]: 
                0 
id1             
a [feat1=b, feat2=asd, feat3=asg, feat1=e, feat2... 
c [feat1=d, feat2=dg, feat3=ag, feat1=f, feat2=a... 

如果我们看一下我们可以看到,我们有值列表的内容:

In [55]:  
gp1.iloc[0].values 

Out[55]: 
array([['feat1=b', 'feat2=asd', 'feat3=asg', 'feat1=e', 'feat2=sdg', 'feat3=as']], dtype=object) 
+0

非常感谢。 – eleanora

1

使用该功能将工作:

def func(dfg): 
    dfu = dfg.unstack() 
    result = dfu.index.get_level_values(0) + '=' + dfu.values 
    return result.tolist() 

df.groupby('id1').apply(func) 

说明:让我们来看看一组,例如dfg = df[df['id1'] == 'c']

dfg.unstack() 
Out[35]: 
id1 1  c 
     3  c 
     4  c 
feat1 1  d 
     3  f 
     4  g 
feat2 1  dg 
     3  as 
     4 adg 
feat3 1  ag 
     3 sdg 
     4  sd 

通过取消堆栈,您可以将值与列名称对齐(忽略中间的索引值)。所有你需要做的是连接:

dfu.index.get_level_values(0) + '=' + dfu.values 
Out[36]: 
Index(['feat1=d', 'feat1=f', 'feat1=g', 'feat2=dg', 'feat2=as', 'feat2=adg', 
     'feat3=ag', 'feat3=sdg', 'feat3=sd'], 
     dtype='object') 

最后,在返回之前转换为列表,否则你最终会得到索引对象。

+0

非常感谢。 – eleanora