2016-08-09 101 views
2

Ich habe einen Datenrahmen, den ich mit einem anderen Datenrahmen durch die Spalte EQ_NR zusammenführen. Hierverschiedene Anzahl von Zeilen nach dem Zusammenführen von zwei Datenrahmen mit Pandas

ist die Struktur des ersten Datenrahmen: (Reihen: 320816)

 FAK_ART FAK_DAT LEIST_DAT  KD_CRM MW_BW  EQ_NR \ 
0   ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 
1   ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 
2   ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 
3   ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 
4   ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 
5   ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 
6   ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 
7   ZPAF 2015-12-10 2015-12-31 T-HOME ICP  E 1001380594 
8   ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380594 

      MATERIAL KW_WERT NETTO_EURO     TA 
0   B60ETS 0.15  18.9    SDH 
1   B60ETS 0.145  18.27    SDH 
2   B60ETS 0.145  18.27    NaN 
3   B60ETS 0.15  18.9    SDH 
4   B60ETS 0.15  18.9    NaN 
5   B60ETS 0.145  18.27    SDH 
6   B60ETS 0.15  18.9    SDH 
7   B60ETS 3.011  252.92   DSLAM/MSAN 
8   B60ETS 3.412  429.91   DSLAM/MSAN 

Hier ist die zweiten: (Reihen: 135818)

    EQ_NR   TA 
0  1001380363 SONSTIGES 
1  1001380363  NaN 
2  1001380363 Sonstiges 
3  1000943704 Sonstiges 
4  1000943823 Sonstiges 
5  1000943985 Sonstiges 
6  1000954774  FMED 
7  1000954790  FMED 
8  1001380363  SDH 
9  1000955097  NaN 

Nach der Zusammenführung I einen Datenrahmen aufweisen mit 'TA' wurde vom zweiten Datenrahmen zum ersten um den Wert von 'EQ_NR' hinzugefügt.

Das Problem ist, dass ich 320816 Zeilen vor dem Zusammenführen und 320871 NACH dem Zusammenführen der beiden Datenrahmen habe. Was könnte passieren, dass es 55 Zeilen mehr als in den Basisdaten gibt?

Ich brauche die Daten einige Berechnungen zu tun und die 55 Zeilen mehr verzerren die Ergebnisse der Berechnungen ...

+1

Dies kann daran liegen, dass im zweiten Datenrahmen eine Eins-zu-viele-Beziehung zwischen EQ_NR und TA besteht. –

+0

es ist sehr nett von Ihnen, einen zweiten DF mit null passenden 'EQ_NR' ...;) – MaxU

+0

oh im sorry für das ... ich bearbeite es .. – Damian

Antwort

1

Es gibt ein Problem mit Duplikaten in der Spalte Verbindungs ​​EQ_NR.

Im Beispiel gibt es doppelte Werte 1001380363 und 1001380594.

Probe:

import pandas as pd 

df1 = pd.DataFrame({'EQ_NR':[1001380363,1001380363,1001380363, 1001380365], 
        'B':[4,5,6,7], 
        'C':[7,8,9,7]}) 

print (df1) 
    B C  EQ_NR 
0 4 7 1001380363 
1 5 8 1001380363 
2 6 9 1001380363 
3 7 7 1001380365 

df2 = pd.DataFrame({'EQ_NR':[1001380363,1001380363,1001380363,1001380363], 
        'B':[4,5,6,8], 
        'C':[7,8,9,3]}) 

print (df2) 
    B C  EQ_NR 
0 4 7 1001380363 
1 5 8 1001380363 
2 6 9 1001380363 
3 8 3 1001380363 
print (pd.merge(df1, df2, on=['EQ_NR'])) 
    B_x C_x  EQ_NR B_y C_y 
0  4 7 1001380363 4 7 
1  4 7 1001380363 5 8 
2  4 7 1001380363 6 9 
3  4 7 1001380363 8 3 
4  5 8 1001380363 4 7 
5  5 8 1001380363 5 8 
6  5 8 1001380363 6 9 
7  5 8 1001380363 8 3 
8  6 9 1001380363 4 7 
9  6 9 1001380363 5 8 
10 6 9 1001380363 6 9 
11 6 9 1001380363 8 3 

EDIT1:

Wenn Datenrahmen df2 haben keine Duplikate Daten in EQ_NR, zu verwenden:

print (df1) 
    FAK_ART  FAK_DAT LEIST_DAT  KD_CRM MW_BW  EQ_NR MATERIAL \ 
0 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 
1 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 
2 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 
3 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 
4 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 
5 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 
6 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 
7 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  E 1001380594 B60ETS 
8 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380594 B60ETS 

    KW_WERT NETTO_EURO   TA 
0 0.150  18.90   SDH 
1 0.145  18.27   SDH 
2 0.145  18.27   NaN 
3 0.150  18.90   SDH 
4 0.150  18.90   NaN 
5 0.145  18.27   SDH 
6 0.150  18.90   SDH 
7 3.011  252.92 DSLAM/MSAN 
8 3.412  429.91 DSLAM/MSAN 

print (df2) 
     EQ_NR   TA 
0 1001380363 Sonstiges 
1 1000943704 Sonstiges 
2 1000943823 Sonstiges 
3 1000943985 Sonstiges 
4 1000954774  FMED 
5 1000954790  FMED 
6 1000955097  NaN 
print (pd.merge(df1, df2, on=['EQ_NR'], how='left', suffixes=('','_new'))) 
    FAK_ART  FAK_DAT LEIST_DAT  KD_CRM MW_BW  EQ_NR MATERIAL \ 
0 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 
1 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 
2 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 
3 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 
4 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 
5 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 
6 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 
7 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  E 1001380594 B60ETS 
8 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380594 B60ETS 

    KW_WERT NETTO_EURO   TA  TA_new 
0 0.150  18.90   SDH Sonstiges 
1 0.145  18.27   SDH Sonstiges 
2 0.145  18.27   NaN Sonstiges 
3 0.150  18.90   SDH Sonstiges 
4 0.150  18.90   NaN Sonstiges 
5 0.145  18.27   SDH Sonstiges 
6 0.150  18.90   SDH Sonstiges 
7 3.011  252.92 DSLAM/MSAN  NaN 
8 3.412  429.91 DSLAM/MSAN  NaN 
+0

ja gibt es doppelte Werte, aber sie sind notwendig. Kann ich das irgendwie handhaben? – Damian

+0

Sie können sie fallen lassen. Ist es in realen Daten möglich? – jezrael

+0

Ich denke nicht, weil es möglich ist, dass die gleiche EQ_NR mehrere Werte hat .. Ich brauche eine Zusammenführung, die genau die Zeilen in der Basisdatei behandelt und nur den TA in der Zeile mit dem EQ_NR ... – Damian

0

wenn Sie nur eine Spalte hinzufügen möchten, können Sie map() Methode verwenden:

In [290]: df1['TA2'] = df1.EQ_NR.map(df2.set_index('EQ_NR').TA) 

In [291]: df1 
Out[291]: 
    FAK_ART  FAK_DAT LEIST_DAT  KD_CRM MW_BW  EQ_NR MATERIAL KW_WERT NETTO_EURO   TA TA2 
0 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 0.150  18.90   SDH AAA 
1 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 0.145  18.27   SDH AAA 
2 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 0.145  18.27   NaN AAA 
3 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 0.150  18.90   SDH AAA 
4 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 0.150  18.90   NaN AAA 
5 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 0.145  18.27   SDH AAA 
6 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380363 B60ETS 0.150  18.90   SDH AAA 
7 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  E 1001380594 B60ETS 3.011  252.92 DSLAM/MSAN NaN 
8 ZPAF 2015-12-10 2015-12-31 T-HOME ICP  B 1001380594 B60ETS 3.412  429.91 DSLAM/MSAN NaN 

wo df2:

In [288]: df2 
Out[288]: 
     EQ_NR TA 
0 1001380363 AAA 

HINWEIS: df2.EQ_NR muss eindeutig sein, sonst werden Sie InvalidIndexError: Reindexing only valid with uniquely valued Index objects Exception. df1.EQ_NR kann Duplikate haben ...

+0

das funktioniert nicht für mein Problem! Es tut uns leid – Damian