Помечать строки на основе значений других столбцов - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть кадр данных pandas:

street_name        eircode
Malborough Road    BLT12
123 Fake Road      NaN
My Street          NaN

Я хотел бы создать еще один столбец с именем уникальный на основе следующих условий:

  1. Если он имеетeircode, верните 'yes' в уникальном столбце, THEN
  2. Если у него нет eircode, проверьте первую строку в street_name :
    • если первая строка является цифрой, вернуть «да» в столбце уникальный
    • , если это не так, вернуть «нет» в столбце уникальный

Я пришел к этому решению, где:

  1. Я изменил типы данных на строку для обоих столбцов street_name и eircode
  2. Получить первую строку с помощью лямбда-функции
  3. Определена функция тегирования, которая будет применена к фрейму данных

# change data types<br> df['eircode'] = df['eircode'].astype('str') df['street_name'] = df['street_name'].astype('str')

# get the first string from street_name column df['first_str'] = df['street_name'].apply(lambda x: x.split()[0])

def tagging(x):
if x['eircode'] != 'nan':
    return 'yes'
elif x['first_str'].isdigit() == True:
    return 'yes'
else:
    return 'no'

df['unique'] = df.apply(tagging, axis=1)

Проблема заключается в том, что мне нужно изменить тип данных, а затем создать отдельный столбец.Есть ли более изящный или более лаконичный способ достижения того же результата?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

С Pandas лучше использовать вычисления по столбцам;apply с пользовательской функцией представляет неэффективный построчный цикл на уровне Python.

df = pd.DataFrame({'street_name': ['Malborough Road', '123 Fake Road', 'My Street'],
                   'eircode': ['BLT12', None, None]})

cond1 = df['eircode'].isnull()
cond2 = ~df['street_name'].str.split(n=1).str[0].str.isdigit()

df['unique'] = np.where(cond1 & cond2, 'no', 'yes')

print(df)

  eircode      street_name unique
0   BLT12  Malborough Road    yes
1    None    123 Fake Road    yes
2    None        My Street     no
0 голосов
/ 21 ноября 2018

Вы можете указать эти отдельные условия с помощью оператора |, а затем сопоставить полученный логический массив с yes и no.Первое условие выглядит более влажным eircode равно нулю, а второе использует регулярное выражение, чтобы проверить, что street_name начинается с цифры:

df['unique'] = ((~df.eircode.isnull()) | (df.street_name.str.match('^[0-9]'))).map({True:'yes',False:'no'})
>>> df
       street_name eircode unique
0  Malborough Road   BLT12    yes
1    123 Fake Road     NaN    yes
2        My Street     NaN     no
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...