Определить переменное количество столбцов в цикле for - PullRequest
0 голосов
/ 26 ноября 2018

Я новичок в pandas и создаю новые столбцы на основе условий из других существующих столбцов, используя следующий код:

df.loc[(df.item1_existing=='NO') & (df.item1_sold=='YES'),'unit_item1']=1
df.loc[(df.item2_existing=='NO') & (df.item2_sold=='YES'),'unit_item2']=1
df.loc[(df.item3_existing=='NO') & (df.item3_sold=='YES'),'unit_item3']=1

По сути, это означает, что если элемент НЕ существует ('НЕТ') и товар продан (' ДА '), затем дайте мне 1. Это работает для создания 3 новых столбцов, но я думаю, что есть лучший способ.Как видите, в названии столбцов есть повторяющаяся строка: «_existing» и «_sold».Я пытаюсь создать цикл for, который будет искать имя столбца, заканчивающегося этим конкретным словом, и объединять начало, что-то вроде этого:

unit_cols = ['item1','item2','item3']
for i in unit_cols:
    df.loc[('df.'+i+'_existing'=='NO') & ('df'+i+'_sold'=='YES'),'unit_'+i]=1 

, но, конечно, это не работает,Как я уже сказал, я могу заставить его работать с первоначальным примером, но мне хотелось бы иметь меньше строк кода вместо повторения одного и того же кода, потому что мне нужно создать несколько столбцов таким образом, а не только три.Есть ли способ сделать это проще?цикл for лучший вариант?Спасибо.

1 Ответ

0 голосов
/ 26 ноября 2018

Вы можете использовать Булеву серию , то есть True / False в зависимости от того, выполнено ли ваше условие.В сочетании с pd.Series.eq и f-строками ( PEP498 , Python 3.6+) и использованием __getitem__ (или его синтаксическим сахаром []) для ввода строк, вы можетенапишите свою логику более наглядно:

unit_cols = ['item1','item2','item3']
for i in unit_cols:
    df[f'unit_{i}'] = df[f'{i}_existing'].eq('NO') & df[f'{i}_sold'].eq('YES')

Если вам нужны целые числа (1 / 0) вместо логических значений, вы можете конвертировать через astype:

    df[f'unit_{i}'] = df[f'unit_{i}'].astype(int)
...