基于两列值合并两个数据框

时间:2018-11-29 06:59:30

标签: pandas dataframe merge

我正在做一个机器学习项目,现在在数据处理部分。无论如何,我有两个数据框,如图所示-

   Final_Lat   Final_Lot  Label
0   37.23140    -121.75853  1.0
1   37.34883    -121.88834  1.0
2   37.31835    -121.85878  1.0
3   37.26027    -121.87655  1.0
4   37.30793    -121.79955  1.0
5   37.24895    -121.87519  1.0


   TestLat      TestLot
0   37.20000    -122.00000
1   37.20000    -121.99999
2   37.20000    -121.99998
3   37.20000    -121.99997
4   37.20000    -121.99996
5   37.20000    -121.99995
6   37.20000    -121.99994
7   37.20000    -121.99993

我想要的是将1的标签移动到出现在同一列表中的坐标,该坐标看起来像这样。并且还应包含来自第二个数据帧的信息。

Final_Lat   Final_Lot  Label
0   37.23140    -121.75853  1.0
1   37.34883    -121.88834  1.0
2   37.31835    -121.85878  1.0
3   37.20000    -122.00000  nan
4   37.20000    -121.99999  nan
2   37.20000    -121.99998  nan

我累了

left = pd.DataFrame({'Final_Lat': Trian['Lat'].apply(float), 
                     'Final_Lot': Trian['Lot'].apply(float),
                     'Label': Trian['L'].apply(float),})

right = pd.DataFrame({'Final_Lat': Fullcoordinate['TestLat'].apply(float), 
                      'Final_Lot': Fullcoordinate['TestLot'].apply(float)})

Final_result = pd.merge(left, right, how='right',on=['Final_Lot','Final_Lat'])

它没有用。我将不胜感激!

right = pd.DataFrame({'Final_Lat': Fullcoordinate['TestLat'](lambda x: pd.to_numeric(x, errors='coerce')).mul(1000).fillna(0).astype(int) , 
                      'Final_Lot': Fullcoordinate['TestLot'](lambda x: pd.to_numeric(x, errors='coerce')).mul(1000).fillna(0).astype(int) })

1 个答案:

答案 0 :(得分:0)

所以这里的问题是与float值合并,因为精度高,我建议将列乘以1000转换为整数,并转换为整数,并通过以下新列转换为merge

old_cols = ['Final_Lat','Final_Lot']
new_cols = ['Final_Lat_int','Final_Lot_int']

Trian[new_cols] = Trian[old_cols].mul(1000).astype(int)
Final_Lat[new_cols] = Final_Lat[old_cols].mul(1000).astype(int)

如果invalid literal for int可能存在问题,则可能存在一些非数值,一种可能的解决方案是将它们转换为NaN,然后转换为0

Trian[new_cols] = Trian[old_cols].apply(lambda x: pd.to_numeric(x, errors='coerce')).mul(1000).astype(int)
Final_Lat[new_cols] = Final_Lat[old_cols].apply(lambda x: pd.to_numeric(x, errors='coerce')).mul(1000).astype(int)

Final_result = pd.merge(Trian.drop(old_cols, axis=1),  
                        Final_Lat,
                        how='right',
                        on=new_cols)
print (Final_result)
   Label  Final_Lat_int  Final_Lot_int  Final_Lat  Final_Lot
0    NaN          37200        -122000       37.2 -122.00000
1    NaN          37200        -121999       37.2 -121.99999
2    NaN          37200        -121999       37.2 -121.99998
3    NaN          37200        -121999       37.2 -121.99997
4    NaN          37200        -121999       37.2 -121.99996
5    NaN          37200        -121999       37.2 -121.99995
6    NaN          37200        -121999       37.2 -121.99994
7    NaN          37200        -121999       37.2 -121.99993