Python:Pandas数据帧合并重复项,用于以';1';

Python:Pandas数据帧合并重复项,用于以';1';,python,pandas,dataframe,Python,Pandas,Dataframe,这真的很奇怪,因为只有合并两个以“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 1

这真的很奇怪,因为只有合并两个以“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]
但当我合并这两个dataframe时,以“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]
由于合并的结果,使它更行。我有许多需要合并的数据帧,因此这会产生更多的行

该代码实际上适用于以“4”开头的数字或任何其他数字或字符串。它只是对以“1”开头的数字有一些问题


如何使其只能正确合并?

有一个问题,您在
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.50



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.50