Hier ist eine Möglichkeit zum Zusammenführen, ohne die Unhashables in Tupel zu konvertieren.
Da der item
Code eine 1-zu-1-Entsprechung mit den Werten in den a
und b
Spalten hat, genügt es, auf item
allein zu verschmelzen. Da die Werte in der Spalte item
hashable sind, ist es kein Problem verschmelzenden:
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)
ergibt
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
Es ist ein bisschen von Ausbesserungsarbeiten nach der Zusammenführung benötigt, jedoch. Da wir nur auf item
verschmelzen, wird result
zwei Spalten von a
und b
- diejenigen von bar
sind a_y
genannt, und b_y
. Die update
Methode wird verwendet, um NaN Werte von a
mit entsprechenden Werten von a_y
, und dann das gleiche ist auch für b
getan.
Die clevere Idee foo.assign(Foo=1), bar.assign(Bar=1)
zu verwenden, um die Foo
und Bar
Spalten von cᴏʟᴅsᴘᴇᴇᴅ's solution genommen zu erhalten.
wenn ich fusionieren, es gibt mir einen Fehler, b sagt, ist eine unhashable Typ numpy.ndarray – niukasu
@niukasu Okay, also Ihre Frage zu Tupeln ist. Aber Sie arbeiten mit numpy Arrays :) –
@niukasu Bearbeitet, sollte die zweite Lösung helfen. –