Как создать определенный фрейм данных на основе Excel-листа?

#python #excel #dataframe

#python #excel #фрейм данных

Вопрос:

Я работаю с Google или инструментами, и в одном из примеров приведена структура данных. Я хотел бы импортировать эту структуру данных на основе таблицы Excel.

Это заданная структура данных:

 jobs = [[[(3, 0), (1, 1), (5, 2)], 
         [(2, 0), (4, 1), (6, 2)],
         [(2, 0), (3, 1), (1, 2)]],
        [[(2, 0), (3, 1), (4, 2)], 
         [(1, 0), (5, 1), (4, 2)],
         [(2, 0), (1, 1), (4, 2)]], 
        [[(2, 0), (1, 1), (4, 2)],
         [(2, 0), (3, 1), (4, 2)],
         [(3, 0), (1, 1), (5, 2)]]]
  

Что мне нравится делать, так это импортировать jobs на основе таблицы Excel с данными, представленными как:

 Job Task    M1  M2  M3
1    1      3   1   5
1    2      2   4   6
1    3      2   3   1
2    1      2   3   4
2    2      2   5   4
2    3      2   1   4
3    1      2   3   4
3    2      3   1   5

  

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

1. Что вы уже пробовали? Вы рассматривали pandas.read_excel ?

2. Да, я пробовал pandas.read_excel (который отлично работает). Но я не уверен, как импортировать его, чтобы получить указанный тип данных (список с кортежами?)

Ответ №1:

Вы должны реорганизовать все свои данные, сгруппировав их по заданиям. Например:

 import pandas as pd

df = pd.read_excel('bb.xlsx')

jobs = set(df['Job'])      #remove duplicates
result = [[[ (df['M1'][i],0), (df['M2'][i],1), (df['M3'][i],2) ] for i in df.index if df['Job'][i] == job] for job in jobs]
print(result)
  

ПРЕДУПРЕЖДЕНИЕ: результат не совсем такой, как вы написали. Я думаю, вы неправильно указали некоторые данные. Скажите мне, если я ошибаюсь.

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

1. Да, вы правы. M1 задачи 2 в Job2 должно быть ‘1’ вместо ‘2’. Я попытался запустить ваш код, но, к сожалению, я получаю синтаксическую ошибку print [[[ (df['M1'][i],0), (df['M2'][i],1), (df['M3'][i],2) ] for i in df.in dex if df['Job'][i] == job] for job in jobs] ^ SyntaxError: invalid syntax

2. вы используете python 2 или 3? в версии 3 синтаксис print отличается, print (…)

3. Использование print ([[ (df['M1'][i],0), (df['M2'][i],1), (df['M3'][i],2) ] for i in df.index if df['Job'][i] == job] for i in jobs) возвращает <generator object <genexpr> at 0x00000000094E4750> . Как я могу получить структуру данных, как показано в первоначальном вопросе? Структура данных используется, например, в нескольких циклах.

4. Я отредактировал свой ответ, чтобы он работал как на Python 2, так и на 3. Вы пропустили некоторые круглые скобки.

Ответ №2:

Я даю другой ответ, используя groupby API pandas:

 import pandas as pd

df = pd.read_excel('bb.xlsx')

result = [[[ (row['M1'],0), (row['M2'],1), (row['M3'],2) ] for idx, row in grpdf.iterrows()] for grpname, grpdf in df.groupby('Job')]
print(result)