Как создать новый столбец на основе формирования строки другой строки в python pandas - PullRequest
2 голосов
/ 15 апреля 2020

Допустим, у меня есть следующее df:

test = pd.DataFrame({'Food': ['Apple Cake', 'Orange Tomato', 'Brocolli Apple', 'Cake Orange', 'Tomato Apple']})
test


       Food
0   Apple Cake
1   Orange Tomato
2   Brocolli Apple
3   Cake Orange
4   Tomato Apple

И я хочу создать новый столбец, который заменяет фактическую еду типом еды:

test1 = pd.DataFrame({'Food': ['Apple Cake', 'Orange Tomato', 'Brocolli Apple', 'Cake Orange', 'Tomato Apple'], 'Type' : ['Fruit Dessert', 'Fruit Veggie', 'Veggie Fruit', 'Dessert Fruit', 'Veggie Fruit']})
test1


       Food             Type
0   Apple Cake      Fruit Dessert
1   Orange Tomato   Fruit Veggie
2   Brocolli Apple  Veggie Fruit
3   Cake Orange     Dessert Fruit
4   Tomato Apple    Veggie Fruit

Как бы я go об этом? я бы сделал словарь из следующего:

{'Fruit' : ['Apple', 'Orange'], 'Veggies': ['Brocolli', 'Tomato'], 'Dessert': 'Cake'}

И что-нибудь сделать с этим словарем? Я не могу понять это. Спасибо!

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

Я бы сделал это следующим образом:

  • Инвертировать словарь списков, чтобы каждое значение становилось ключом, а соответствующий ключ - словарём
  • Разделение строки, stack входящие в pd.Series, отображение с полученным словарем, groupby индекс первого уровня и join назад

d  = {'Fruit' :['Apple', 'Orange'], 'Veggies':['Brocolli', 'Tomato'], 'Dessert': 'Cake'}

d_inv = {i: k  for k,v in d.items() for i in (v if isinstance(v, list) else [v])}
# {'Apple': 'Fruit', 'Orange': 'Fruit', 'Brocolli': 'Veggies', 'Tomato': 
# 'Veggies', 'Cake': 'Dessert'}

test['type'] = (test.Food.str.split(expand=True)
                         .stack()
                         .map(d_inv)
                         .groupby(level=0)
                         .agg(' '.join))

print(test)

        Food           type
0      Apple Cake  Fruit Dessert
1   Orange Tomato  Fruit Veggies
2  Brocolli Apple  Veggies Fruit
3     Cake Orange  Dessert Fruit
4    Tomato Apple  Veggies Fruit
1 голос
/ 15 апреля 2020

Не думаю, что вы можете сделать это за один проход ... но вы можете сделать это за несколько проходов:

test = pd.DataFrame({'Food': ['Apple Cake', 'Orange Tomato', 'Brocolli Apple', 'Cake Orange', 'Tomato Apple']})

dict = {'Fruit' : [r'Apple', r'Orange'], 'Veggies': [r'Brocolli', r'Tomato'], 'Dessert': [r'Cake']}

test['Type'] = test['Food']
for k in dict.keys():
    test['Type'] = test['Type'].replace(regex=dict[k], value=k)

test
       Food             Type
0   Apple Cake      Fruit Dessert
1   Orange Tomato   Fruit Veggie
2   Brocolli Apple  Veggie Fruit
3   Cake Orange     Dessert Fruit
4   Tomato Apple    Veggie Fruit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...