Сдвиг строк с отсутствующими данными в python - PullRequest
0 голосов
/ 16 марта 2020

У меня есть текстовый файл, который я прочитал через python, который выглядит следующим образом:

Text File:
18|Male|66|180|Brown
23|Female|67|120|Brown
16|71|192|Brown
22|Male|68|185|Brown
24|Female|62|100|Blue

В одной из строк отсутствуют данные, и проблема заключается в том, что когда я читаю его в фрейм данных выглядит так:

   Age  Gender  Height Weight   Eyes
0   18    Male      66    180  Brown
1   23  Female      67    120  Brown
2   16      71     192  Brown    NaN
3   22    Male      68    185  Brown
4   24  Female      62    100   Blue

Мне интересно, есть ли способ сместить строку, в которой отсутствуют данные, без смещения всех столбцов. Вот что у меня получилось:

import pandas as pd

df = pd.read_csv('C:/Documents/file.txt', sep='|', names=['Age','Gender', 'Height', 'Weight', 'Eyes'])

df_full = df.loc[df['Gender'].isin(['Male','Female'])]

df_missing = df.loc[~df['Gender'].isin(['Male','Female'])]

df_missing = df_missing.shift(1,axis=1)

df_final = pd.concat([df_full, df_missing])

Я надеялся просто выделить те, у которых пропущены данные, сместить столбцы на единицу, а затем вернуть фрейм данных обратно в данные, в которых нет пропущенных данных. , Но я не уверен, как go о смещении столбцов в определенной точке. Вот результат, который я пытаюсь получить:

   Age  Gender  Height Weight   Eyes
0   18    Male      66    180  Brown
1   23  Female      67    120  Brown
2   16     NaN      71    192  Brown
3   22    Male      68    185  Brown
4   24  Female      62    100   Blue

Не имеет значения, как я это делаю, но файлы, которые я использую, имеют тысячи строк, поэтому я не могу их исправить индивидуально. Любая помощь приветствуется. Спасибо!

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Выборочное смещение части каждой из строк , в которых отсутствуют значения.

df.apply(lambda r: r[:1].append(r[1:].shift()) 
                   if r['Gender'] not in ['Male', 'Female'] 
                   else r, axis=1)

Данные со смещенным столбцом для каждой затронутой записи будут выровнены с «NaN», вставленным там, где отсутствующее значение было во входном тексте.

   Age  Gender  Height Weight   Eyes              Age  Gender Height Weight   Eyes
1   23  Female      67    120  Brown           1   23  Female     67    120  Brown
2   16      71     192  Brown    NaN  ======>  2   16     NaN     71    192  Brown

Для отдельной записи это сделаем это:

df.loc[2] = df.loc[2][:1].append(df.loc[2][1:].shift())

Начиная со столбца «Пол», данные смещаются вправо. Заполнение по умолчанию - «NaN». Столбец «Возраст» сохраняется.

1 голос
/ 16 марта 2020

RegEx может помочь здесь.

Поиск ^ (\ d + \ |) (\ d) и замена с использованием $ 1 | $ 2 (только что добавили одну вертикальную черту, где Пол отсутствует "группа 1 + | + группа 2" )

Это можно сделать практически во всех текстовых редакторах (Notepad ++ , VS C, Sublime et c.)

См. Пример по ссылке: https://regexr.com/50gkh

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...