Как выполнить итерации для изменения фиктивной переменной в нескольких столбцах с 1 на 0 в Python и Pandas?

#python #pandas #for-loop

#python #pandas #для цикла

Вопрос:

У меня есть фрейм данных, содержащий более 200 столбцов фиктивной переменной:

 Row1 Feature1 Feature2 Feature3 Feature4 Feature5
A    0        1        1        1        0
B    0        0        1        1        1
C    1        0        1        0        1
D    0        1        0        1        0
  

Я хочу выполнить итерацию для разделения каждой функции, чтобы создать дополнительные 3 фрейма данных, в которых df1 содержит только первую функцию, которая = 1 равна 1, и изменяет все последующие столбцы на 0, а df2 содержит только вторую функцию, которая = 1 равна 1, и изменяет все предыдущие и последующие столбцы на 0.

У меня есть коды создания для этого, но я подумал, что должны быть лучшие способы сделать это. Пожалуйста, помогите мне найти более эффективный способ решения этой проблемы. Спасибо!

Ниже приведен мой код:

 for index, row in hcit1.iterrows():
    for i in range(1,261):
        title="feature" str(i)
        if int(row[title])==1:
            for j in range(i 1,261):
                title2="feature" str(j)
                hcit1.loc[index,title2]=0          
        else:
            pass

for index, row in hcit2.iterrows():
    for i in range(1,261):
        title="feature" str(i)
        if int(row[title])==1:
            for j in range(i 1,261):
                title2="feature" str(j)
                if row[title2]==1:
                for k in range(j 1,261):
                    title3="feature" str(k)
                    hcit1.loc[index,title3]=0 
                    hcit1.loc[index,title]=0 
    else:
        pass

for index, row in hcit3.iterrows():
    for i in range(1,261):
        title="feature" str(i)
        if int(row[title])==1:
            for j in range(i 1,261):
                title2="feature" str(j)
                if row[title2]==1:
                    for k in range(j 1,261):
                        title3="feature" str(k)
                        if row[title3]==1:
                            for l in range(k 1,261):
                                title4="feature" str(l)
                                hcit1.loc[index,title4]=0 
                                hcit1.loc[index,title2]=0 
                                hcit1.loc[index,title]=0 
        else:
            pass

for index, row in hcit4.iterrows():
    for i in range(1,261):
        title="feature" str(i)
        if int(row[title])==1:
            for j in range(i 1,261):
                title2="feature" str(j)
                if row[title2]==1:
                    for k in range(j 1,261):
                        title3="feature" str(k)
                        if row[title3]==1:
                            for l in range(k 1,261):
                                title4="feature" str(l)
                                if row[title4]==1:
                                    for m in range(l 1,261):
                                        title5="feature" str(m)
                                        hcit1.loc[index,title5]=0 
                                        hcit1.loc[index,title3]=0 
                                        hcit1.loc[index,title2]=0 
                                        hcit1.loc[index,title]=0 
        else:
            pass
  

Комментарии:

1. Пожалуйста, отформатируйте код. Это очень сложно поддерживать. Особенно, когда это код python , где отступы очень важны.

2. Спасибо за предложения. Я все еще изучаю форматирование в Stackoverflow.

Ответ №1:

Здесь:

 df1 = df[df['Feature1'] == 1]
df1.iloc[:, :] = 0
df1.loc[:, 'Feature1'] = 1
df2 = df[df['Feature2'] == 1]
df2.iloc[:, :] = 0
df2.loc[:, 'Feature2'] = 1
df3 = df[df['Feature2'] == 1]
df3.iloc[:, :] = 0
df3.loc[:, 'Feature3'] = 1
  

Это должно быть то, что вы ищете.