2017-06-07 3 views
1

Das ist wirklich seltsam, da dies nur geschehen, wenn merge zwei Datenrahmen, die Vektor beginnen mit ‚1‘Python: Pandas Dataframe Duplikate für Element verschmelzen mit ‚1‘ beginnen

>>> df_mo 
    Stock Momentum_ 
0  1A0  0.00 
1  1A1  0.00 
2  1A4  0.00 
3  1B0  0.00 
4  1B1  0.15 
5  1B6  0.00 
6  1C0  0.00 
7  1C3  0.00 
8  1C5  0.00 
9  1D0  0.00 
10 1D1  0.00 
11 1D3  -0.50 
12 1D4  0.00 
13 1D5  0.00 
14 1D8  0.00 
15 40B  -0.15 
16 40D  0.00 
17 40E  0.00 
18 40F  0.00 
19 40N  0.00 
20 40R  0.00 
21 40S  0.15 
22 40T  0.15 
23 40U  0.00 
24 40V  0.00 
25 40W  0.00 
26 41A  0.00 
27 41B  0.15 
28 41F  0.00 
29 41H  0.00 
.. ...  ... 
757 T8JU  0.00 
758 T8V  0.00 
759 TQ5  0.00 
760 TS0U  0.00 
761 U04  0.00 
762 U06  0.00 
763 U09  0.00 
764 U10  0.00 
765 U11  0.00 
766 U13  0.00 
767 U14  0.00 
768 U6C  0.00 
769 U77  0.00 
770 U96  0.00 
771 U9E  0.00 
772 UD1U  0.00 
773 UD2  0.00 
774 UV1  0.00 
775 V01  0.00 
776 V03  0.00 
777 W05  0.00 
778 Y03  0.00 
779 Y06  0.00 
780 Y35  0.00 
781 Y45  0.00 
782 Y92  0.00 
783 Z25  0.00 
784 Z59  0.00 
785 Z74  0.00 
786 Z77  0.00 
[787 rows x 2 columns] 

>>> df_active 
    Stock Active 
0  1A0 0.35 
1  1A1 0.35 
2  1A4 -0.35 
3  1B0 0.50 
4  1B1 -0.35 
5  1B6 -0.35 
6  1C0 0.50 
7  1C3 -0.35 
8  1C5 0.35 
9  1D0 -0.50 
10 1D1 0.50 
11 1D3 0.35 
12 1D4 -0.50 
13 1D5 0.35 
14 1D8 -0.50 
15 40B 0.35 
16 40D -0.35 
17 40E -0.50 
18 40F -0.35 
19 40N 0.35 
20 40R 0.25 
21 40S 0.50 
22 40T 0.50 
23 40U 0.35 
24 40V 0.35 
25 40W -0.35 
26 41A -0.35 
27 41B -0.35 
28 41F 0.50 
29 41H -0.50 
.. ...  ... 
757 T8JU 0.35 
758 T8V 0.35 
759 TQ5 -0.50 
760 TS0U 0.50 
761 U04 0.50 
762 U06 0.50 
763 U09 -0.50 
764 U10 0.50 
765 U11 0.50 
766 U13 -0.35 
767 U14 0.50 
768 U6C -0.25 
769 U77 -0.25 
770 U96 -0.50 
771 U9E -0.50 
772 UD1U 0.50 
773 UD2 -0.50 
774 UV1 -0.35 
775 V01 -0.50 
776 V03 0.50 
777 W05 0.25 
776 V03 0.50 
778 Y03 0.20 
779 Y06 -0.35 
780 Y35 0.35 
781 Y45 -0.25 
782 Y92 0.50 
783 Z25 0.50 
784 Z59 0.50 
785 Z74 -0.35 
786 Z77 0.50 
[787 rows x 2 columns] 

Aber wenn ich fusionierte diese beiden Datenrahmen hat Die Aktie, die mit "1" beginnt, wird alle drei Mal extra dupliziert.

>>> pd.merge(df_mo,df_active,how='outer',on='Stock') 
    Stock Momentum_ Active 
11 1A4  0.00 -0.35 
0  1A0  0.00 0.35 
1  1A0  0.00 0.35 
2  1A0  0.00 0.35 
3  1A0  0.00 0.35 
4  1A1  0.00 0.35 
5  1A1  0.00 0.35 
6  1A1  0.00 0.35 
7  1A1  0.00 0.35 
8  1A4  0.00 -0.35 
9  1A4  0.00 -0.35 
10 1A4  0.00 -0.35 
11 1A4  0.00 -0.35 
12 1B0  0.00 0.50 
13 1B0  0.00 0.50 
14 1B0  0.00 0.50 
15 1B0  0.00 0.50 
16 1B1  0.15 -0.35 
17 1B1  0.15 -0.35 
18 1B1  0.15 -0.35 
19 1B1  0.15 -0.35 
20 1B6  0.00 -0.35 
21 1B6  0.00 -0.35 
22 1B6  0.00 -0.35 
23 1B6  0.00 -0.35 
24 1C0  0.00 0.50 
25 1C0  0.00 0.50 
26 1C0  0.00 0.50 
27 1C0  0.00 0.50 
28 1C3  0.00 -0.35 
29 1C3  0.00 -0.35 
.. ...  ...  ... 
787 T8JU  0.00 0.35 
788 T8V  0.00 0.35 
789 TQ5  0.00 -0.50 
790 TS0U  0.00 0.50 
791 U04  0.00 0.50 
792 U06  0.00 0.50 
793 U09  0.00 -0.50 
794 U10  0.00 0.50 
795 U11  0.00 0.50 
796 U13  0.00 -0.35 
797 U14  0.00 0.50 
798 U6C  0.00 -0.25 
799 U77  0.00 -0.25 
800 U96  0.00 -0.50 
801 U9E  0.00 -0.50 
802 UD1U  0.00 0.50 
803 UD2  0.00 -0.50 
804 UV1  0.00 -0.35 
805 V01  0.00 -0.50 
806 V03  0.00 0.50 
807 W05  0.00 0.25 
808 Y03  0.00 0.20 
809 Y06  0.00 -0.35 
810 Y35  0.00 0.35 
811 Y45  0.00 -0.25 
812 Y92  0.00 0.50 
813 Z25  0.00 0.50 
814 Z59  0.00 0.50 
815 Z74  0.00 -0.35 
816 Z77  0.00 0.50 
[817 rows x 3 columns] 

Als das Ergebnis der Zusammenführung machen Sie es mehr Zeile. Ich habe viele Datenframes, die zusammengeführt werden müssen und dadurch enden viel mehr Zeilen, als es sollte.

Der Code funktioniert tatsächlich gut für Nummer Start mit '4' oder einer anderen Zahl oder Zeichenfolge. Es hat nur einige Probleme für die Nummer Start mit '1'.

Wie kann man es nur richtig zusammenführen?

Antwort

0

Es ist ein Problem, dass Sie doppelte Werte in Stock Spalte haben, beginnt Duplikate mit 1.

Sie können es durch:

print (df_mo[df_mo['Stock'].duplicated(keep=False)]) 
print (df_active[df_active['Stock'].duplicated(keep=False)]) 

Lösung ist Duplikate entfernen. Z.B .:

df_active = df_active.drop_duplicates('Stock') 
df_mo= df_mo.drop_duplicates('Stock') 

Probe:

print (df_mo) 
    Stock Momentum_ 
0 1A0  0.0 
0 1A0  0.0 
0 1A0  0.0 
1 1A1  0.0 
2 1A4  0.0 
3 1A4  0.0 

print (df_active) 
    Stock Active 
0 1A0 0.35 
0 1A0 0.55 
1 1A1 0.35 
2 1A4 -0.35 
3 1A4 0.50 

df = pd.merge(df_mo,df_active,how='outer',on='Stock') 
print (df) 
    Stock Momentum_ Active 
0 1A0  0.0 0.35 
1 1A0  0.0 0.55 
2 1A0  0.0 0.35 
3 1A0  0.0 0.55 
4 1A0  0.0 0.35 
5 1A0  0.0 0.55 
6 1A1  0.0 0.35 
7 1A4  0.0 -0.35 
8 1A4  0.0 0.50 
9 1A4  0.0 -0.35 
10 1A4  0.0 0.50 

print (df_mo[df_mo['Stock'].duplicated(keep=False)]) 
    Stock Momentum_ 
0 1A0  0.0 
0 1A0  0.0 
0 1A0  0.0 
2 1A4  0.0 
3 1A4  0.0 

print (df_active[df_active['Stock'].duplicated(keep=False)]) 
    Stock Active 
0 1A0 0.35 
0 1A0 0.55 
2 1A4 -0.35 
3 1A4 0.50 

df_active = df_active.drop_duplicates('Stock') 
df_mo= df_mo.drop_duplicates('Stock') 

df = pd.merge(df_mo,df_active,how='outer',on='Stock') 
print (df) 
    Stock Momentum_ Active 
0 1A0  0.0 0.35 
1 1A1  0.0 0.35 
2 1A4  0.0 -0.35