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

Я хотел бы скопировать значения из одного столбца (ЛИЧНАЯ ИНФОРМАЦИЯ) в другой (ПЕРЕМЕННАЯ) на основе нескольких условий, перечисленных ниже.

  1. Проверьте, начинается ли столбец «ЛИЧНАЯ ИНФОРМАЦИЯ» с цифр

  2. Проверьте, является ли соответствующее значение строки в столбце «ПЕРЕМЕННАЯ» Nan

  3. Проверьте, не является ли предыдущее значение строки в столбце «ПЕРЕМЕННАЯ» Nan (здесь «пол» не является nan, но могут быть случаи, когда это Nan)

После того, как все условия выполнены, я хотел бы скопировать значения из столбца «ЛИЧНАЯ ИНФОРМАЦИЯ» В СТОЛБЦ «ПЕРЕМЕННАЯ»

Пожалуйста, найдите ниже, как выглядят входные данные

df = pd.DataFrame({'PERSONAL INFORMATION':['Gender','1.Male','2.Female','Ethnicity','1.Chinese','2.Indian','3.Eurasian','Marital Status','1.Single','2.Married','3.Divorced'], 'VARIABLE':['gender', np.nan, np.nan,'ethn',np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan]})

Параметры семейного положения не следует копировать в столбец «Переменная», так как предыдущая строка здесь — Нэн.

Я использовал параметр np.where, но не знал, как проверить значение предыдущей строки. Я не хочу использовать цикл for.

df['VARIABLE'] = np.where((df['PERSONAL 
INFORMATION'].str.startswith(('\d+')) == True) & (df['VARIABLE'].isna() == 
True) & 3RD CONDITION FOR PREVIOUS ROW CHECK

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

@SELVA - Можете ли вы добавить некоторые образцы данных для проверки 3RD CONDITION FOR PREVIOUS ROW CHECK?

jezrael 29.05.2019 08:06

В приведенном выше примере предыдущая строка имеет значение «пол». Поскольку это не nan, мы можем скопировать данные из столбца PI в столбец Variable. Если вы просите 10-15 строк, не могли бы вы сообщить мне, как я могу загрузить их сюда?

The Great 29.05.2019 08:08

@SELVA - попробуйте скопировать их как текст с 4 пробелами в начале строк для правильного форматирования. Попробуй как знаешь, помогу потом с форматированием.

jezrael 29.05.2019 08:10

@SELVA - Или попробуйте отредактировать df = pd.DataFrame({'PERSONAL INFORMATION':['Gender','1.Male','2.Female'], 'VARIABLE':['gender', np.nan, np.nan]})

jezrael 29.05.2019 08:12

@jezrael - Personal_Information,Variable Gender,gender 1. Мужской,нет данных 2. Женский,нет данных Этническая принадлежность, ethn 1. Китайский, нет данных 2. Малайский, нет данных 3. Индийский, нет данных 4. Другие: пожалуйста, укажите ___ Текущее семейное положение,a6marrstat 1 n Никогда не был женат, нет данных 2. В настоящее время женат, нет данных 3. Живут отдельно, но не разведены, нет данных 4. Разведен, нет данных 5. Вдовец, нет данных 6. Живет отдельно/разведен, нет данных 7. Не женат, нет данных 888. Отказано, нет данных

The Great 29.05.2019 08:15

@SELVA - Супер, можешь добавить это в df = pd.DataFrame({'PERSONAL INFORMATION':['Gender','1.Male','2.Female'], 'VARIABLE':['gender', np.nan, np.nan]}) ? Спасибо.

jezrael 29.05.2019 08:16

df = pd.DataFrame({'ЛИЧНАЯ ИНФОРМАЦИЯ':['Пол','1.Мужской','2.Женский','Этническая принадлежность','1.Китайский','2.Индийский','3‌​ .Евразийка','Семейное положение','1.Не замужем','2.Женат','3.Разведен'], 'ПЕРЕМЕННАЯ':['gender', np.nan, np.nan,'ethn',np .nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.n‌​an]})

The Great 29.05.2019 08:20

Параметры семейного положения не следует копировать в столбец «Переменная», так как предыдущая строка здесь — Нэн.

The Great 29.05.2019 08:21

Ответ был отредактирован.

jezrael 29.05.2019 08:27
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
9
123
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что вам нужно Series.str.contains с ^ для начала строки и \d для цифры, затем создайте группы, проверив значения, не содержащие цифры с Series.cumsum и GroupBy.transform с first:

m1 = df['PERSONAL INFORMATION'].str.contains('^\d')
s = df.groupby((~m1).cumsum())['VARIABLE'].transform('first')

mask = m1 & df['VARIABLE'].isna() & s.notna()

df.loc[mask, 'VARIABLE'] = df.loc[mask, 'PERSONAL INFORMATION']
print (df)
   PERSONAL INFORMATION    VARIABLE
0                Gender      gender
1                1.Male      1.Male
2              2.Female    2.Female
3             Ethnicity        ethn
4             1.Chinese   1.Chinese
5              2.Indian    2.Indian
6            3.Eurasian  3.Eurasian
7        Marital Status         NaN
8              1.Single         NaN
9             2.Married         NaN
10           3.Divorced         NaN

Подробности:

print ((~m1).cumsum())
0     1
1     1
2     1
3     2
4     2
5     2
6     2
7     3
8     3
9     3
10    3
Name: PERSONAL INFORMATION, dtype: int32

print (df.groupby((~m1).cumsum())['VARIABLE'].transform('first'))
0     gender
1     gender
2     gender
3       ethn
4       ethn
5       ethn
6       ethn
7        NaN
8        NaN
9        NaN
10       NaN
Name: VARIABLE, dtype: object

Не могли бы вы помочь мне понять применение оператора тильды? Я имею в виду, что 0 должны быть инвертированы в 1 и наоборот, но здесь я вижу, что 7 и 8 преобразуются в 3. Помогите мне понять, как это работает?

The Great 29.05.2019 08:39

@SELVA - меняет маску, заполненную True и False, как это

jezrael 29.05.2019 08:40

Другие вопросы по теме