2017-10-02 2 views
-1

Ich habe zwei Tabellen mit den gleichen Dimensionen und möchte die dritte wo jede Zelle, wenn das Ergebnis der Anwendung einer binären Funktion auf entsprechende Zellen dieser beiden Tabellen. Zum Beispiel:Kombinieren Sie zwei DataFrames paarweise mit einer binären Funktion

$ t1 
array([[0, 1], 
     [2, 3]]) 

$ t2 
array([["A", "B"], 
     ["C", "D"]]) 

$ combine(t1, t2, lambda x, y: "{}-{}".format(x, y)) 
array([["0-A", "1-B"], 
     ["2-C", "3-D"]]) 

Mit anderen Worten, ich mag eine verallgemeinerte Version von elementweise Operationen wie Add, div usw. Klingt wie eine einfache Aufgabe, aber ich konnte nicht überall finden, wie dies leicht zu tun.

+0

bitte kleine (3-5 Zeilen) Probeneingangsdatensätzen und den gewünschten Datensatz ... – MaxU

+0

@MaxU einen zusätzlichen Nutzen bieten. – Yuuri

Antwort

2

Angenommen, die Spalten haben denselben Namen, können Sie df.apply verwenden.

df1.apply(lambda x: binary_function(x, df2[x.name])) 

df1 
    0 1 
0 0 1 
1 2 3 

df2 
    0 1 
0 A B 
1 C D 

df1.astype(str) + '-' + df2 
    0 1 
0 0-A 1-B 
1 2-C 3-D 

allgemeiner:

df1.apply(lambda x: x.astype(str) + '-' + df2[x.name]) 
    0 1 
0 0-A 1-B 
1 2-C 3-D 

Mit str.format:

df1.apply(lambda x: ['{}-{}'.format(k, y) for k, y in zip(x, df2[x.name].values)]) 
    0 1 
0 0-A 1-B 
1 2-C 3-D 
+0

Dies kombiniert Zeilen, keine Zellen! – Yuuri

+0

@Yuuri Ich habe meine Antwort bearbeitet, um die Daten aus Ihrem Beispiel hinzuzufügen. Ich bin mir nicht sicher, was du mehr davon willst. –

+0

@COLDSPEED Scheint, dass Sie die im Beispiel verwendete binäre Funktion geändert haben, so dass es mit Reihen und nicht mit Skalarzellen arbeiten könnte. Mit .format funktioniert es nicht. – Yuuri

1

Demo für DFs mit nicht ausgerichteten Indizes und Spalten:

Setup:

In [26]: d1 = pd.DataFrame(t1) 

In [27]: d2 = pd.DataFrame(t2, index=[3,5], columns=['a','b']) 

In [28]: d1 
Out[28]: 
    0 1 
0 0 1 
1 2 3 

In [29]: d2 
Out[29]: 
    a b 
3 A B 
5 C D 

Lösung:

In [30]: d1.astype(str).add('-').add(d2.values) 
Out[30]: 
    0 1 
0 0-A 1-B 
1 2-C 3-D 
Verwandte Themen