Я хотел бы скопировать значения из одного столбца (ЛИЧНАЯ ИНФОРМАЦИЯ) в другой (ПЕРЕМЕННАЯ) на основе нескольких условий, перечисленных ниже.
Проверьте, начинается ли столбец «ЛИЧНАЯ ИНФОРМАЦИЯ» с цифр
Проверьте, является ли соответствующее значение строки в столбце «ПЕРЕМЕННАЯ» Nan
Проверьте, не является ли предыдущее значение строки в столбце «ПЕРЕМЕННАЯ» 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. Если это Нэн, я не хочу копировать данные. Если это не Нан, то данные надо копировать
В приведенном выше примере предыдущая строка имеет значение «пол». Поскольку это не nan, мы можем скопировать данные из столбца PI в столбец Variable. Если вы просите 10-15 строк, не могли бы вы сообщить мне, как я могу загрузить их сюда?
@SELVA - попробуйте скопировать их как текст с 4 пробелами в начале строк для правильного форматирования. Попробуй как знаешь, помогу потом с форматированием.
@SELVA - Или попробуйте отредактировать df = pd.DataFrame({'PERSONAL INFORMATION':['Gender','1.Male','2.Female'], 'VARIABLE':['gender', np.nan, np.nan]})
@jezrael - Personal_Information,Variable Gender,gender 1. Мужской,нет данных 2. Женский,нет данных Этническая принадлежность, ethn 1. Китайский, нет данных 2. Малайский, нет данных 3. Индийский, нет данных 4. Другие: пожалуйста, укажите ___ Текущее семейное положение,a6marrstat 1 n Никогда не был женат, нет данных 2. В настоящее время женат, нет данных 3. Живут отдельно, но не разведены, нет данных 4. Разведен, нет данных 5. Вдовец, нет данных 6. Живет отдельно/разведен, нет данных 7. Не женат, нет данных 888. Отказано, нет данных
@SELVA - Супер, можешь добавить это в df = pd.DataFrame({'PERSONAL INFORMATION':['Gender','1.Male','2.Female'], 'VARIABLE':['gender', np.nan, np.nan]})
? Спасибо.
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.nan]})
Параметры семейного положения не следует копировать в столбец «Переменная», так как предыдущая строка здесь — Нэн.
Ответ был отредактирован.
Я считаю, что вам нужно 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. Помогите мне понять, как это работает?
@SELVA - меняет маску, заполненную True
и False
, как это
@SELVA - Можете ли вы добавить некоторые образцы данных для проверки
3RD CONDITION FOR PREVIOUS ROW CHECK
?