Проблема при объединении pandas столбцов и усечении десятичных знаков без округления до python? - PullRequest
0 голосов
/ 06 августа 2020

У меня есть фрейм данных, как показано ниже

Вход

 df.head(6)
 Lat       Lon
 13.34563   -9.45
 5.897        10.345
 NaN         NaN
-8.7865      8.2
 4.782833    9.9098

Я хочу создать новый столбец с именем param, который содержит как Lat, так и Lon до трех десятичные разряды без округления, и если присутствуют только один или два десятичных знака, а лишний ноль делает его тремя десятичными

Ожидаемый результат

Param
13.345:-9.450
5.897:10.345
NaN
-8.786:8.200
4.782:9.909

Как это можно сделать в python?

Мой код

import math
def truncate(f,n):
    return math.floor(f*10**n)
try :
  df['Lat']  = (df['Lat'].apply(lambda x : truncate(x,3)))/1000
except:
    df['Lat']=np.nan


 try :
      df['Lon']  = (df['Lon'].apply(lambda x : truncate(x,3)))/1000
    except:
      df['Lon']=np.nan

df['param'] = df['Lat'].astype(str) + : + shipment['Lon'].astype(str)

Но это не работает. Любая помощь приветствуется?

Ответы [ 3 ]

3 голосов
/ 06 августа 2020

Вы можете просто dropna затем reindex назад

def func(y,n):
    if y < 0 :
      return "%0.3f" % (-(y * 10 ** n // -1 / 10 ** n))
    else :
      return "%0.3f" % (y * 10 ** n // 1 / 10 ** n)


df['Param']=df[['Lat','Lon']].dropna().applymap(lambda x : func(x,3) ).agg(':'.join,1).reindex(df.index)


Out[101]: 
         Lat      Lon          Param
0  13.345630  -9.4500  13.345:-9.450
1   5.897000  10.3450   5.897:10.345
2        NaN      NaN            NaN
3  -8.786500   8.2000   -8.786:8.200
4   4.782833   9.9098    4.782:9.909
1 голос
/ 06 августа 2020

Попробуйте следующее:

df['Param'] = df.apply( lambda x:  "%5.3f:%5.3f" % ( x['Lat'],x['Lon'] ) , axis = 1 )

Результат:

         Lat      Lon          Param
0  13.345630  -9.4500  13.346:-9.450
1   5.897000  10.3450   5.897:10.345
2        NaN      NaN      nan:  nan
3  -8.786500   8.2000   -8.787:8.200
4   4.782833   9.9098    4.783:9.910
0 голосов
/ 06 августа 2020

с использованием строковых методов.

s = df.stack().astype(str).str.split('.',expand=True)
s[1] = s[1].str[:3].str.ljust(3,'0')

df['strLat'] =  (s[0] + '.' +  s[1]).unstack().agg(':'.join,1)

print(df)

         Lat      Lon         strLat
0  13.345630  -9.4500  13.345:-9.450
1   5.897000  10.3450   5.897:10.345
2        NaN      NaN            NaN
3  -8.786500   8.2000   -8.786:8.200
4   4.782833   9.9098    4.782:9.909
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...