【问题标题】:merging two dataframes based on two columns of values基于两列值合并两个数据框
【发布时间】:2019-05-01 04:31:19
【问题描述】:

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

   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) })

【问题讨论】:

  • 你能解释一下你的输出吗?
  • 是的!基本上我正在做一个犯罪预测项目,Test Lat 和 Lot 是一个区域内所有可能的坐标组合,Final Lat 和 Lot 是之前发生犯罪的坐标。我正在尝试将这两个列表合并在一起,以便将发生犯罪的坐标列为 1。我希望这很清楚...

标签: pandas dataframe merge


【解决方案1】:

所以这里的问题是与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

【讨论】:

  • 在比较测试批次和纬度与最终批次和纬度时会不会丢失一些信息?
  • nvm,我看到了多个部分。让我试试看 rn
  • 它给了我这个错误...ValueError: invalid literal for int() with base 10
  • @YunxiaoJia - Mybe 一些缺失值,.mul(1000).fillna(0).astype(int) 工作如何?
  • @YunxiaoJia - 所以问题是一些非数值,需要 .apply(lambda x: pd.to_numeric(x, errors='coerce')).mul(1000).fillna(0)。 astype(int)
猜你喜欢
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多