Перебирать многоиндексные строки и столбцы DataFrame - PullRequest
0 голосов
/ 18 октября 2018

У меня есть DataFrame (1000,1000), у которого есть Multi-Index в строках label_y1, label_y2 и столбцах label_x1, label_x2.Я хочу перебрать все строки и столбцы, и установить все на ноль, кроме тех случаев, когда выбранные строка и столбец соответствуют .В идеале это работает для одного столбца и строки - оба с Multi-Index -, но это может также работать для более чем одного столбца и строки.

DataFrame выглядит следующим образом:

local или

label_columns1 = ['testing','done']
label_columns2 = ['A', 'B']
label_rows1 = ['testing','done']
label_rows2 = ['A', 'B']

local = pd.DataFrame([[1,2,3,4]], index=pd.MultiIndex.from_product([label_rows1,label_rows2]), columns=pd.MultiIndex.from_product([label_columns1, label_columns2 ]))

print(local)

       testing    done   
             A  B    A  B
row1 A       1  2    3  4
     B       1  2    3  4
row2 A       1  2    3  4
     B       1  2    3  4

В случае столбцов я решил проблему с помощью следующего кода:

for col in local.columns:
    if col != ('done', 'A'):
        local[col].values[:] = 0

Это дает:

print(local)

       testing    done   
             A  B    A  B
row1 A       0  0    3  0
     B       0  0    3  0
row2 A       0  0    3  0
     B       0  0    3  0

Я делаю это аналогично для строк.Я также пробовал с local.iterrrows() и loc строками, но это не работает.Есть идеи, как мне это сделать?Что мне нужно, это:

print (local)

           testing    done   
             A  B    A  B
row1 A       0  0    0  0
     B       0  0    0  0
row2 A       0  0    3  0
     B       0  0    0  0

1 Ответ

0 голосов
/ 18 октября 2018

Вы можете применить аналогичную логику (хотя и неэффективно, чтобы объединить ее)

import pandas as pd    
label_columns1 = ['testing','done']
label_columns2 = ['A', 'B']
label_rows1 = ['testing','done']
label_rows2 = ['A', 'B']

local = pd.DataFrame([[1,2,3,4]], index=pd.MultiIndex.from_product([label_rows1,label_rows2]), columns=pd.MultiIndex.from_product([label_columns1, label_columns2 ]))


for col in local.columns:
    for row in local.index:
        if col != ('done', 'A'):
            local.loc[:,col] = 0
        if row != ('done', 'A'):
            local.loc[row,:] = 0


print(local)



          testing    done   
                A  B    A  B
testing A       0  0    0  0
        B       0  0    0  0
done    A       0  0    3  0
        B       0  0    0  0

Дополнительные условия будут реализованы с помощью или / как список кортежей.

Альтернативный методбудет использовать функции местоположения в пандах, чтобы установить значения не меток как таковых.Дополнительные условия метки реализованы в списке, переданном в функцию isin.

local.loc[~local.index.isin([('done','A')]),:]=0
local.loc[:,~local.index.isin([('done','A')])]=0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...