Изменение столбца на основе подстроки в другом столбце в кадре данных - PullRequest
0 голосов
/ 25 сентября 2019

Часть моего фрейма данных выглядит следующим образом.

  | Apple-cake | Apple-danish | Bacon-egg | Bacon-flour | notes         |
--|------------|--------------|-----------|-------------|---------------|
0 |            |              |           |             | AcBef         |
--|------------|--------------|-----------|-------------|---------------|
1 |            |              |           |             | Ad            |
--|------------|--------------|-----------|-------------|---------------|
2 |            |              |           |             | AcBe          |
--|------------|--------------|-----------|-------------|---------------|
3 |            |              |           |             |               |
--|------------|--------------|-----------|-------------|---------------|
4 |            |              |           |             | BfeAc         |
--|------------|--------------|-----------|-------------|---------------|
5 |            |              |           |             | Bf            |
--|------------|--------------|-----------|-------------|---------------|

Я пытаюсь добавить код в фрейм данных, чтобы в строках были размещены буквы "X" в зависимости от значений в "Заметках".Например, в строке 0, поскольку в «Заметках» есть «А» и «С», в колонке «Яблочный пирог» следует поместить «Х».При правильном коде пример должен выглядеть следующим образом.

  | Apple-cake | Apple-danish | Bacon-egg | Bacon-flour | notes         |
--|------------|--------------|-----------|-------------|---------------|
0 |     X      |              |     X     |      X      | AcBef         |
--|------------|--------------|-----------|-------------|---------------|
1 |            |       X      |           |             | Ad            |
--|------------|--------------|-----------|-------------|---------------|
2 |     X      |              |     X     |             | AcBe          |
--|------------|--------------|-----------|-------------|---------------|
3 |            |              |           |             |               |
--|------------|--------------|-----------|-------------|---------------|
4 |     X      |              |     X     |      X      | BfeAc         |
--|------------|--------------|-----------|-------------|---------------|
5 |            |              |           |      X      | Bf            |
--|------------|--------------|-----------|-------------|---------------|

Я пробовал несколько функций (формул?), Чтобы получить то, что мне нужно, но пока ничего не получалось.Например, я пробовал

df["Apple-cake"] = np.where(df["Notes"].str.contains("A"), "Y", "")

, но в каждом ряду под заголовком «Яблочный пирог» ставилось «X».

Я тоже пробовал это, но ни один из них не работал.

 if df.loc[df["Notes"].str.contains("A&c")]:
     df["Apple-cake"] = "X"


 df.loc["A" in df["Notes"], "Apple-cake"] = "X"


 if all(x in df["notes"] for x in ["A","c"]):
     df["Apple-cake"] = "X"
  1. Можно ли это сделать?
  2. Если это так, могу ли я иметь два условия, чтобы, если df ["Notes"]. Str.contains "A" и df ["Notes"]. Str.contains "c", то поместить "X" в"Яблочный пирог"?
  3. Как мне обработать пустую строку (# 3)?

Заранее спасибо.

ОБНОВЛЕНИЕ
У меня естьобеспечил лучшее представление исходного кадра данных и желаемого результата.

ОБНОВЛЕНИЕ # 2
У меня была идея изменить ответ @ milos.ai, добавив словарь для получения имен столбцов.

def decode_notes(note):
    dict_item = {
        "A": "Apple",
        "c": "cake",
        "d": "danish",
        "B": "Bacon",
        "e": "egg",
        "f": "flour",
        }

        pairs = []
        current_upper = []
        for i in note:
            if i.isupper():
                current_upper = dict_item[i]
            if i.islower():
                pairs.append(current_upper+"-"+dict_item[i])
        return pairs

for i,row in df.iterrows():
    columns_for_x = decode_notes(row['notes'])

    for col in columns_for_x:
        df.set_value(i, col, 'X') 

Но яЯ все еще получаю ошибку

File "c:/Users/.../Get info.py", line 354, in __init__
columns_for_x = decode_notes(row["Notes"])
File "c:/Users/.../Get info.py", line 338, in decode_notes
for i in note:
TypeError: 'float' object is not iterable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...