вложенные итерации в пандах - PullRequest
0 голосов
/ 31 августа 2018

У меня есть файл с примерно 25 листами, и каждый лист содержит 5-30 столбцов с именами систем в качестве заголовков. Я хочу перебрать список из примерно 170 систем (список находится на одном из листов основного файла), и каждая система ищет в каждой вкладке столбцы с соответствующей системой в качестве заголовка. У меня есть код ниже, и он отлично работает для первой итерации, но по какой-то причине после того, как он проходит по всем листам и переходит ко второй системе, он вытягивает имя листа, а не имя второй системы. Кто-нибудь видит, что я делаю не так?

import pandas as pd

matrix = pd.ExcelFile('file')
names_tab = pd.read_excel(matrix, sheet_name='Name_Test')

sheets_list = {}

for (y, sysRows) in names_tab.iterrows():
    print(sysRows['header'])

    for sheets in matrix.sheet_names[1:]:
        sheets_list['{}'.format(sheets)] = pd.read_excel(matrix, sheet_name='{}'.format(sheets), skiprows=2)
        print(sheets)

        for column in sheets_list[sheets]:

            if column == sysRows['header']:
                for idx, row in sheets_list[sheets][column].iteritems():
                    if sheets_list[sheets].iloc[idx][column] == 'x':
                        print('{} has X in row {} column {} on sheet {}'
                              .format(sysRows['header'], idx, column, sheets))
                    elif sheets_list[sheets].iloc[idx][column] == 'X':
                        print('{} has X in row {} column {} on sheet {}'
                              .format(sysRows['header'], idx, column, sheets))
                print(column + ' works')
            else:
                print(column + ' doesnt work')

1 Ответ

0 голосов
/ 31 августа 2018

Я не совсем уверен, что это тот же результат, которого вы пытаетесь достичь, но, надеюсь, это отправная точка (я сомневаюсь, что вам нужно 4 для циклов):

import pandas as pd
import numpy as np

names_tab = pd.DataFrame({'header':['System1','System2','System3'], 'some_other_column':['foo','bar','foobar']})
sheet1 = pd.DataFrame({'System1':['x','X'], 'System2':['x','X'], 'System4':['X','x']})
sheet2 = pd.DataFrame({'System2':['X','x'], 'System8':['x','x'], 'System3':['x','X']})
sheets = [sheet1, sheet2]
for i, sheet in enumerate(sheets):
    print("Sheet", i + 1)
    common_columns = list(set(sheet.columns.tolist()).intersection(names_tab['header'].tolist()))
    df = sheet[common_columns]
    print("Here are all the 'x' values in Sheet", i + 1)
    print(df.where(df == 'x'))
    # To get your behavior
    positions = np.where(df.values == 'x')
    for idx, col in positions:
        print('{} has x in row {} column {} on sheet {}'.format(df.columns[col], idx, col, str(i+1)))

Возможно, вы могли бы предоставить Минимальный, Полный и Проверяемый пример .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...