Часть моего фрейма данных выглядит следующим образом.
| 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"
- Можно ли это сделать?
- Если это так, могу ли я иметь два условия, чтобы, если df ["Notes"]. Str.contains "A" и df ["Notes"]. Str.contains "c", то поместить "X" в"Яблочный пирог"?
- Как мне обработать пустую строку (# 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