2016-09-18 83 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