Условное разбиение строки на основе другого столбца st Python - PullRequest
0 голосов
/ 04 октября 2018

Привет, ребята, есть ли чистый способ упорядочить эти данные в правильные столбцы для последующего геолокации?

 import pandas as pd

 coordinates = {'event': ['1', '2', '3', '4'],
     'direction': ['E', 'E,N', 'N,E', 'N'],
     'location': ['316904', '314798,5812040', '5811316,314766', '5811309']}
 df = pd.DataFrame.from_dict(coordinates)
 df

Как это должно выглядеть:

 Event  direction    location    easting    northing
  1       E          316904       316904       NA
  2       E,N     314798,5812040   314798    5812040
  3       N,E     5811316,314766   314766    5811316
  4       N          5811309         NA      5811309

Iможно разделить местоположение с помощью: df['easting'], df['northing'] = df['location'].str.split(',',1).str

, но мне нужно условие , когда E THEN 1-е значение восточнее, второе на север ИЛИ условие, когда N значение 1 восточнее и так далее ..

любые идеи будут с благодарностью оценены!

1 Ответ

0 голосов
/ 04 октября 2018

Решение 1:

Сначала split столбцов на новые, а затем меняйте значения по логической маске, созданной startswith:

df[['easting','northing']] = df['location'].str.split(',',1, expand=True)
mask = df['direction'].str.startswith('N')
df.loc[mask, ['easting','northing']] = df.loc[mask, ['northing','easting']].values

print (df)
  event direction        location easting northing
0     1         E          316904  316904     None
1     2       E,N  314798,5812040  314798  5812040
2     3       N,E  5811316,314766  314766  5811316
3     4         N         5811309    None  5811309

Решение 2:

Сначала выровняйте значения для помощника DataFrame, затем используйте pivot и последнее соединение с оригиналом по join:

from itertools import chain

direc = df['direction'].str.split(',')
loc = df['location'].str.split(',')
lens = loc.str.len()
df1 = pd.DataFrame({
    'direction' : list(chain.from_iterable(direc.tolist())), 
    'loc' : list(chain.from_iterable(loc.tolist())), 
    'event' : df['event'].repeat(lens)
})

df2 = df1.pivot('event','direction','loc').rename(columns={'E':'easting','N':'northing'})
print (df2)
direction easting northing
event                     
1          316904      NaN
2          314798  5812040
3          314766  5811316
4             NaN  5811309

df = df.join(df2, on='event')
print (df)
  event direction        location easting northing
0     1         E          316904  316904      NaN
1     2       E,N  314798,5812040  314798  5812040
2     3       N,E  5811316,314766  314766  5811316
3     4         N         5811309     NaN  5811309
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...