2015-10-27 88 views
1

我想使用熊貓將兩列轉換爲一列,這是一個字典表示的兩個轉換列。熊貓 - 將兩列轉換爲一個新的字段作爲字典

df = DataFrame({'Metrics' : [[("P", "P"), ("Q","Q")], ("K", "K"), ("Z", "Z")], 
       'Stage_Name' : ["P", "K", "Z"], 
       'Block_Name' : ["A", "B", "A"]}) 

基本上我想合併MetricsStage_Name

enter image description here

到名爲merged另一列,例如,第一排是:

{'P': [('P', 'P'), ('Q', 'Q')]} 

我知道如何將一行轉換爲字典表示,但是,我不知道如何對所有ro進行此操作WS沒有一個循環:

something = df.iloc[[0]].set_index('Stage_Name')['Metrics'].to_dict() 
print something 
Output: {'P': [('P', 'P'), ('Q', 'Q')]} 

後來我想基於Block_Name聚集,所以對於合併列,其結果將是兩本字典爲Block_Name加在一起:A

{'P': [('P', 'P'), ('Q', 'Q')], 'Z' : [('Z', 'Z')] } 

對於Stage_NameMetrics,我就已經是附加到一個列表,它看起來像這樣:

grouped = df.groupby(df['Block_Name']) 
df_2 = grouped.aggregate(lambda x: tuple(x)) 

enter image description here

能有人指出正確的方向?謝謝!

回答

1

IIUC正確,那麼你使用applylambda

In [19]: 
df['merged'] = df.apply(lambda row: {row['Stage_Name']:row['Metrics']}, axis=1) 
df 

Out[19]: 
    Block_Name   Metrics Stage_Name       merged 
0   A [(P, P), (Q, Q)]   P {'P': [('P', 'P'), ('Q', 'Q')]} 
1   B   (K, K)   K    {'K': ('K', 'K')} 
2   A   (Z, Z)   Z    {'Z': ('Z', 'Z')} 
+0

沒」我知道我可以用ap層和軸= 1,謝謝! – user1157751

+1

你只能在dfs上使用'axis = 1',而不能在'Series'上使用''''''''''''''''''''''''''''''''''''''''''這個方法可行,但是,這也是我試圖通過行的方式訪問單獨列 – EdChum

3
df['Merged'] = [{key: val} for key, val in zip(df.Stage_Name, df.Metrics)] 

>>> df 
    Block_Name   Metrics Stage_Name        Merged 
0   A [(P, P), (Q, Q)]   P {u'P': [(u'P', u'P'), (u'Q', u'Q')]} 
1   B   (K, K)   K     {u'K': (u'K', u'K')} 
2   A   (Z, Z)   Z     {u'Z': (u'Z', u'Z')} 

然後你的代碼生成所需的結果:

grouped = df.groupby(df['Block_Name']) 
df_2 = grouped.aggregate(lambda x: tuple(x))[['Metrics', 'Stage_Name']] 


>>> df_2 
           Metrics Stage_Name 
Block_Name          
A   ([(P, P), (Q, Q)], (Z, Z))  (P, Z) 
B       ((K, K),)  (K,) 

時間:

%timeit df['Merged'] = [{key: val} for key, val in zip(df.Stage_Name, df.Metrics)] 
10000 loops, best of 3: 162 µs per loop 

%timeit df['merged'] = df.apply(lambda row: {row['Stage_Name']:row['Metrics']}, axis=1) 
1000 loops, best of 3: 332 µs per loop 
+0

@Alexandar避免,因爲我認爲最好使用熊貓的內置矢量化函數。 – user1157751

+2

@ user1157751一個常見的誤解。見上面的表現結果。 – Alexander

+0

@Alexandar,哦,哇,我沒想到外部連接會更快。 – user1157751

相關問題