這是一種合併的方式,而不會將unhashables轉換爲元組。
由於item
碼具有1對1的對應關係與在a
和 b
列中的值,它足以對單獨item
合併。由於在item
列中的值是哈希的, 是沒有問題的合併:
import pandas as pd
foo = pd.DataFrame({'item': list('ABC'), 'a':[1,1,0], 'b':[[2,0], [3,0], [4,0]]})
bar = pd.DataFrame({'item': list('AD'), 'a':[1,0], 'b':[[2,0], [6,1]]})
result = pd.merge(foo.assign(Foo=1), bar.assign(Bar=1), on='item', how='outer',
suffixes=['', '_y'])
for col in ['a','b']:
result[col].update(result[col+'_y'])
for col in ['Foo', 'Bar']:
result[col] = result[col].fillna(0)
result = result.drop(['a_y', 'b_y'], axis=1)
print(result)
產生
a b item Foo Bar
0 1.0 [2, 0] A 1.0 1.0
1 1.0 [3, 0] B 1.0 0.0
2 0.0 [4, 0] C 1.0 0.0
3 0.0 [6, 1] D 0.0 1.0
有一點在合併後需要補妝的工作,但是。由於我們只 上item
合併,result
得到的a
和b
兩列 - 從bar
的那些被稱爲a_y
和b_y
。使用update
方法從a
填充來自a
的NaN值 ,其中a_y
的相應值,然後b
也完成相同的 。
聰明的主意,用foo.assign(Foo=1), bar.assign(Bar=1)
獲得Foo
和Bar
列從cᴏʟᴅsᴘᴇᴇᴅ's solution拍攝。
當我合併,它給了我一個錯誤說,b是unhashable型numpy.ndarray – niukasu
@niukasu好了,你的問題是關於元組。但你正在努力陣列:) –
@niukasu編輯,第二個解決方案應該有所幫助。 –