Как извлечь конкретный шаблон c номер из списка внутри столбца pandas кадра данных - PullRequest
0 голосов
/ 06 августа 2020

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

  1. Извлечь и сохранить только 3 десятичных знака от первого числа до comma ,, а также сохранить только 3 десятичных знака для второго число.

  2. Запятую следует заменить на :

  3. Если число имеет только две десятичные точки, добавьте еще один ноль, чтобы получилось 3 десятичные точки.

Ввод

  df
    [151.20732,-33.86785]
    [81.67732,-09.86]
    [1.2890,43.8] 
    [567.200,33.867]
    [557.21,33.86]

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

151.207:-33.867
81.677:-09.860
1.289:43.800
567.200:33.867
557.210,33.860

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

Ответы [ 2 ]

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

Это сложно, чем я думал

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.apply(lambda x : ':'.join([ func (y, 3) for y in x]) )
Out[86]: 
0    151.207:33.867
1      81.677:9.860
2      1.289:43.800
3    567.200:33.867
4    557.210:33.860
dtype: object

Ввод

data = [[151.20732,-33.86785],
        [81.67732,-09.86],
        [1.2890,43.8],
        [567.200,33.867],
        [557.21,33.86]]
df = pd.Series(data)
0 голосов
/ 06 августа 2020

Вариант ввода 1 кадра данных:

data = [[[151.20732,-33.86785]],
        [[81.67732,-09.86]],
        [[1.2890,43.8]],
        [[567.200,33.867]],
        [[557.21,33.86]]]
df = pd.DataFrame(data, columns=['geo'])

Вариант ввода 2 кадра данных: literal_eval используется для чтения CSV-файла, содержащего список, в противном случае список читается как одна строка.

import ast

literal = lambda x: ast.literal_eval(x)
data = pd.read_csv('/Test_data.csv', converters={'geo.geometry.coordinates': literal})

df = pd.DataFrame(data, columns=['geo.geometry.coordinates'])
df.rename(columns = {'geo.geometry.coordinates':'geo'}, inplace = True)

Алгоритм:

import math

def trunc(f,d):
    # Truncate float (f) to d decimal places, unless NaN
    return 'nan' if math.isnan(f) else f"{int(f*10**d)/10**d:0.{d}f}"

df['geo_neo'] = df.apply(lambda r:  trunc(r['geo'][0], 3) + ':'
                                  + trunc(r['geo'][1], 3), axis = 1)

Вывод DataFrame:

                      geo          geo_neo
0  [151.20732, -33.86785]  151.207:-33.867
1       [81.67732, -9.86]    81.677:-9.860
2           [1.289, 43.8]     1.289:43.800
3         [567.2, 33.867]   567.200:33.867
4         [557.21, 33.86]   557.210:33.860
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...