2017-10-21 94 views
1

假設我有一個熊貓數據幀,其中兩列由字符串列表的如下所示一到在大熊貓數據幀串的兩個列表之間的一對一映射

df=pd.DataFrame({'A' : [ ['a','b','c'], ['d','e','f'] ], 'B':[ ['g','h','i'], ['j','k','l'] ] }) 

我想連接在所述第一字符串元素在A中的第一個列表中的第一個字符串元素位於B的第一個列表中,並帶有連字符等。最終的產品將是另一個C柱使

df['C'] = [ ['a-g','b-h','c-i'], ['d-j','e-k','f-l' ] ] 

我嘗試了不同的功能與應用。()和map(),但什麼也沒有產生預期的結果,任何幫助表示讚賞。

回答

1

我會跟apply + np.core.defchararray.add做到這一點:

from numpy.core.defchararray import add 

df['C'] = df[['A', 'B']].apply(lambda x: add(add(x.A, '-'), x.B).tolist(), 1) 
df 

      A   B    C 
0 [a, b, c] [g, h, i] [a-g, b-h, c-i] 
1 [d, e, f] [j, k, l] [d-j, e-k, f-l] 

只記得我說過在列表中存儲的數據。


如果有可能你的列是不是同樣大小,你可以做一個if檢查:

def foo(x): 
    if len(x.A) == len(x.B): 
     return add(add(x.A, '-'), x.B).tolist() 
    return [] 

df['C'] = df[['A', 'B']].apply(foo, 1) 
+0

它不工作!實際上,它給出了與前面建議的答案相同的錯誤'傳遞值的形狀是(17,2),指數意味着(17,34)'知道數據框的形狀是17行和34列。我儘可能地回答了你的答案,它在數據框僅包含這2列的時候工作,當你添加其他類型的額外列時,它就不再工作了。我試圖用df [['A','B']]替換df.apply。現在應用它給我下面的錯誤'無法從形狀(15)廣播輸入數組到形狀(2)' –

+0

@MartinHeusen如果你如果要連接所有34列,最好確保每個單元格的元素數量完全相同。 –

+0

不,我不想連接34列,只有2列,我知道每行中列表的長度是相同的。每行的長度可能不同,但在每行中它們是相同的! –

2

您可以使用str.cat

df['C'] = df.A.str.cat(df.B, sep='-') 

df 
# A B C 
#0 a e a-e 
#1 b f b-f 
#2 c g c-g 
#3 d h d-h 

或者直接加入兩列:在編輯的數據

df.A + '-' + df.B 

#0 a-e 
#1 b-f 
#2 c-g 
#3 d-h 
#dtype: object 

更新

df=pd.DataFrame({'A':[['a','b','c'], ['d','e','f']], 'B':[['g','h','i'], ['j','k','l']]}) 

df['C'] = df.apply(lambda r: [a+'-'+b for a,b in zip(r.A, r.B)], axis=1) 

df 
#   A   B     C 
#0 [a, b, c] [g, h, i] [a-g, b-h, c-i] 
#1 [d, e, f] [j, k, l] [d-j, e-k, f-l] 
+0

@MartinHeusen您可以編輯您的問題詳細說說嗎? –

+0

感謝您的回答。其實我在提問時犯了一個錯誤。我要連接的兩列都是由列表組成的,所以數據框如下所示:df = pd.DataFrame({'A':[['a','b','c'],['d', 'e','f']],'B':[['g','h','i'],['j','k','l']]})是df ['C'] = [['a-g','b-h','c-i'],['d-j','e-k','fl']],你能請幫助? –

+0

嘗試'df ['C'] = df.apply(lambda r:[a +' - '+ b for a,b in zip(r.A,r.B)],axis = 1)''。 – Psidom

1

選項1
使用numpy.core.defchararray.add

from numpy.core.defchararray import add 

a = np.array(df.values.tolist()) 

df.assign(C=add(add(a[:, 0], '-'), a[:, 1]).tolist()) 

      A   B    C 
0 [a, b, c] [g, h, i] [a-g, b-h, c-i] 
1 [d, e, f] [j, k, l] [d-j, e-k, f-l] 

選項2
list自定義子類有趣的方式,並重新定義+

class list_(list): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

    def __add__(self, other): 
     return list_(map('-'.join, (map(str, t) for t in zip(self, other)))) 

df.assign(C=df.applymap(list_).sum(1).apply(list)) 

      A   B    C 
0 [a, b, c] [g, h, i] [a-g, b-h, c-i] 
1 [d, e, f] [j, k, l] [d-j, e-k, f-l] 
相關問題