这真的很奇怪,因为只有当合并了两个以'1‘开始的股票数据时,才会发生这种情况。
>>> 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]但是当我合并这两个数据的时候,以'1‘开始的股票就会重复3倍。
>>> 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]由于合并结果使其更多行。我有许多需要合并的dataframe,因此它最终会产生更多的数据行。
实际上,该代码对于以'4‘或任何其他数字或字符串开头的数字很好。它只是有一些问题的数字开始'1‘。
如何使它只能正确地合并?
发布于 2017-06-07 08:45:23
在Stock列中存在重复值的问题,重复值以1开头。
你可以通过以下方式检查:
print (df_mo[df_mo['Stock'].duplicated(keep=False)])
print (df_active[df_active['Stock'].duplicated(keep=False)])解决方案是删除重复项。例如:
df_active = df_active.drop_duplicates('Stock')
df_mo= df_mo.drop_duplicates('Stock')示例:
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.50print (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.50df_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.35https://stackoverflow.com/questions/44407745
复制相似问题