Проверьте предыдущее значение строки, чтобы скопировать данные из одного столбца в другой - PullRequest
2 голосов
/ 29 мая 2019

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

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

  2. Проверьте, соответствует ли значение соответствующей строки в столбце «VARIABLE» Nan

  3. Проверьте, соответствует ли предыдущее значение строки в столбце «VARIABLE»это не Нан (здесь «пол» - не нан, но могут быть случаи, когда это Нан)

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

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

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, но не знал, как проверить предыдущее значение строки.Я не хочу использовать для цикла.

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

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

1 Ответ

2 голосов
/ 29 мая 2019

Полагаю, вам нужно 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...