Манипуляции со строкой в ​​столбце (pandas): разделение, замена, соединение - PullRequest
1 голос
/ 28 мая 2020

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

  • если строка содержит dog / dog / chien / chiens, добавьте -00
  • , если строка содержит cats / cat / chat / chats, затем добавьте 00-

Пример данных выглядит следующим образом:

Animal 

22 dogs
1 dog
1 cat
3 dogs
32 chats

и так далее.

Я бы хотел вывести столбец только с числами (числовыми):

Animal        New column

22 dogs       22-00
1 dog         1-00
1 cat         00-1
3 dogs        3-00
32 chats      00-32

Думаю, мне следует использовать условие if для проверки слов, затем .split и .join. Речь идет о манипуляциях со строками, но мне сложно решить эту проблему.

Ответы [ 5 ]

1 голос
/ 28 мая 2020
PRES = set(("cats", "cat", "chat", "chats"))
POSTS = set(("dogs", "dog", "chien", "chiens"))

def fun(words):
    # words will come as e.g. "22 dogs"
    num, ani = words.split()
    if ani in PRES:
        return "00-" + num
    elif ani in POSTS:
        return num + "-00"
    else:
        # you might want to handle this..
        return "unexpected"

df["New Column"] = df["Animal"].apply(fun)

где df - ваш фрейм данных. Для быстрого поиска мы превращаем списки условий в наборы. Затем мы применяем функцию к значениям столбца Animal в df и действуем соответственно.

1 голос
/ 28 мая 2020

Поскольку ваши данные хорошо отформатированы, вы можете использовать базовую замену c и apply в строке:

import pandas as pd
import re

def replacer(s):
    return re.sub(r" (chiens?|dogs?)", "-00", 
                  re.sub(r"(\d+) ch?ats?", r"00-\1", s))

df = pd.DataFrame({"Animal": ["22 dogs", "1 dog", "1 cat", "3 dogs", "32 chats"]})
df["New Column"] = df["Animal"].apply(replacer)

Вывод:

     Animal New Column
0   22 dogs      22-00
1     1 dog       1-00
2     1 cat       00-1
3    3 dogs       3-00
4  32 chats      00-32
1 голос
/ 28 мая 2020

Вы можете сделать это, сначала извлеките число, а затем используйте np.where, чтобы условно добавить символы в строку:

df['New Col'] = df['Animal'].str.extract(r'([0-9]*)')
df['New Col'] = np.where(df['Animal'].str.contains('dogs|dog|chiens|chien'), df['New Col']+'-00', df['New Col'])
df['New Col'] = np.where(df['Animal'].str.contains('cats|cat|chat|chats'), '00-'+df['New Col'], df['New Col'])
print(df)

     Animal New Col
0   22 dogs   22-00
1     1 dog    1-00
2     1 cat    00-1
3    3 dogs    3-00
4  32 chats   00-32
0 голосов
/ 29 мая 2020

Создать кортеж искомых слов

dog = ('dogs', 'dog', 'chien', 'chiens')
cat = ('cats', 'cat', 'chat', 'chats')

Создайте условия для каждого кортежа, созданного с соответствующими заменами, и примените условия к столбцу, используя numpy select :

num = df.Animal.str.split().str[0] #the numbers
#conditions
cond1 = df.Animal.str.endswith(dog)        
cond2 = df.Animal.str.endswith(cat)
condlist = [cond1,cond2]
#what should be returned for each successful condition
choicelist = [num+"-00","00-"+num]

df['New Column'] = np.select(condlist,choicelist)
df

    Animal    New Column
0   22 dogs     22-00
1   1 dog       1-00
2   1 cat       00-1
3   3 dogs      3-00
4   32 chats    00-32
0 голосов
/ 28 мая 2020

Использование re:

import re

list1 = ['dogs', 'dog', 'chien', 'chiens']
list2 = ['cats', 'cat', 'chat', 'chats']

df['New_col'] = [(re.search(r'(\w+)', val).group(1).strip()+"-00") if re.search(r'([a-zA-Z]+)', val).group(1).strip() in list1 else ("00-" + re.search(r'(\w+)', val).group(1).strip()) if re.search(r'([a-zA-Z]+)', val).group(1).strip() in list2 else val for val in list(df['Animal'])]

print(df)

Вывод:

     Animal New_col
0   22 dogs   22-00
1     1 dog    1-00
2     1 cat    00-1
3    3 dogs    3-00
4  32 chats   00-32
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...