Как выполнить фильтрацию на основе некоторой части значения строк в кадре данных pandas - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть pandas dataframe, как показано ниже:

   +------+---+
   |Name  |age|
   +------+---+
   |Mona  |12 |
   +------+---+
   |Monika|25 |
   +------+---+
   |Tomas |3  |
   +------+---+
   |Ilyas |47 |
   +------+---+

Теперь я хочу присвоить некоторые значения в новом столбце столбцу Name, содержащему некоторую подстроку.Например, если он содержит Mon, тогда мы присваиваем им text, а если он содержит as, мы присваиваем им city.

Таким образом, вывод должен быть:

   +------+---+----+
   |Name  |age|new |
   +------+---+----+
   |Mona  |12 |text|
   +------+---+----+
   |Monika|25 |text|
   +------+---+----+
   |Tomas |3  |city|
   +------+---+----|
   |Ilyas |47 |city|
   +------+---+----+

Я написал следующие коды, и это не сработало:

df['new'] = np.nan    
df['new'] = df['new'].mask( 'Mon' in df['Name'], 'text')    
df['new'] = df['new'].mask( 'as' in df['Name'], 'city')

Ответы [ 4 ]

0 голосов
/ 20 февраля 2019

Я думаю, это будет ваша лучшая ставка, поскольку она будет обрабатывать регистрозависимые совпадения и заполнять NaN, если ни одно из условий не выполнено.

import numpy as np

     Name  Age
0    Mona   12
1  Monika   25
2   Tomas    3
3   Ilyas   47

default = np.where(df.Name.str.contains('as', case=False), 'city', np.nan)
cond = np.where(df.Name.str.contains('Mon', case=False), 'text', default)

df.assign(new=cond)

     Name  Age   new
0    Mona   12  text
1  Monika   25  text
2   Tomas    3  city
3   Ilyas   47  city
0 голосов
/ 20 февраля 2019
Df.loc[df.name.str.endswith('as'), 'new'] = 'city'
Df.loc[df.name.str.startswith('Mon'), 'new'] = 'text'

У Str есть метод beginWith и заканчиваетсяWith для такого рода проблем.Вероятно, есть способ сделать это в одной строке, но сейчас мне ничего не приходит в голову.

Loc всегда помогает при выборе и обновлении данных при условии.

Редактировать: Хуан С прав, он должен быть «содержит», а не «начинается с», мой плохой.

0 голосов
/ 20 февраля 2019

Если ваша логика усложняется, вы можете инкапсулировать ваше отображение в функцию:

def map_func(name):
    if 'Mon' in name:
        return 'text'
    elif 'as' in name:
        return 'city'

df['Name'].map(map_func)

Результат:

0    text
1    text
2    city
3    city
Name: Name, dtype: object
0 голосов
/ 20 февраля 2019

Это должно сделать:

df['new']=np.where(df.Name.str.contains('Mon'), 'text', 'city')

np.where работает как IF в Excel: если условие выполнено, заполните 'text', иначе заполните 'city'.

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