Группировка и экспорт строк Excel с использованием Python - PullRequest
0 голосов
/ 28 октября 2019

Это с использованием Python.

У меня есть лист Excel, который в своей основной форме выглядит следующим образом:

New York    Cup a   3
Stockholm   Plate b 5
Madrid  Cup a   2
New York    Cup b   5
New York    Plate a 8
Madrid  Cup b   9
Stockholm   Plate a 2
Stockholm   Cup a   5
Stockholm   Cup b   3
Madrid  Cup a   5
New York    Plate a 8

Я хочу сгруппировать места вместе, чтобы все новые йоркивместе и madrids и т. д. и экспортировать их в отдельные листы Excel под названием Нью-Йорк, Мадрид, Стокгольм. С той же информацией о строках. Так что, в основном, просто скопируйте и вставьте строку в новый лист Excel, названный в честь этой строки. Затем я хочу добавить все чашки вместе как одну и все тарелки как одну на второй странице каждой. Имеет ли смысл сделать это перед экспортом данных, верно?

Конечный результат Названы 3 листа Excel, содержащие только их данные, и некоторая простая математика на втором листе.

Настоящий лист Excel - этоимеем дело с 15000 строк, 50 локаций и 100 предметов. Эти изменения, поэтому должны быть процедурным путем. Нью-Йорк может быть Торонто в следующий раз.

До сих пор я был в состоянии сгруппировать их по пандам, но каждая попытка после этого потерпела неудачу.

Новичок в пандах, поэтому я подумал, что это будет относительно легко сделать.

import pandas as pd

stock_report_excel = "small_stores_blocked_stock_value.xlsx"

df_soh = pd.read_excel(stock_report_excel, sheet_name='SOH')
df_stores = df_soh.groupby(['Site Name'])

цикл предположений для добавления на лист

добавление элементов на лист 2

экспорт

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Ответ на вопрос

import pandas as pd

import os

file = "yourfile.xlsx"

extension = os.path.splitext(file)[1]

filename = os.path.splitext(file)[0]

abpath = os.path.dirname(os.path.abspath(file))

df=pd.read_excel(file, sheet_name="sheetname")

colpick = "column to extract" 

cols=list(set(df[colpick].values))


def sendtofile(cols):

    for i in cols:
        df[df[colpick] == i].to_excel("{}/exported/{}.xlsx".format(abpath, i), sheet_name=i, index=False)
return
0 голосов
/ 28 октября 2019

Хотя не очень понятно, какова ваша цель, я думаю, Pandas MultiIndex DataFrame может быть полезен для вас. Ниже я пишу несколько простых кодов, и пожелание может помочь вам в дальнейшем.

import pandas as pd
sites=pd.Series(['New York','Stockholm','Madrid','New York','New York','Madrid','Stockholm','Stockholm','Stockholm','Madrid','New York'])
col2=pd.Series(['Cup','Plate','Cup','Cup','Plate','Cup','Plate','Cup','Cup','Cup','Plate'])
col3=pd.Series(['a','b','a','b','a','b','a','a','b','a','a'])
col4=pd.Series([3,5,2,5,8,9,2,5,3,5,8])
data=pd.DataFrame({'sites':sites,'col2':col2,'col3':col3,'col4':col4})
# You can of course replce all the codes above with Pandas read related functions.
data1 = data.set_index(['sites','col2','col3']) # Set as MultiIndex DataFrame.
data1.loc[('New York'),:] # This will give you all the 'New York' data
data1.loc[('New York','Cup'),:] # This will give you all the 'New York' & 'Cup' data.
# Retrieving all the 'Cup' data is a bit tricky, see the following
idx=pd.IndexSlice
data1.loc[idx[:,'Cup'],:]

Вывод следующим образом.

# data
        sites   col2 col3  col4
0    New York    Cup    a     3
1   Stockholm  Plate    b     5
2      Madrid    Cup    a     2
3    New York    Cup    b     5
4    New York  Plate    a     8
5      Madrid    Cup    b     9
6   Stockholm  Plate    a     2
7   Stockholm    Cup    a     5
8   Stockholm    Cup    b     3
9      Madrid    Cup    a     5
10   New York  Plate    a     8
# data1
                      col4
sites     col2  col3
New York  Cup   a        3
Stockholm Plate b        5
Madrid    Cup   a        2
New York  Cup   b        5
          Plate a        8
Madrid    Cup   b        9
Stockholm Plate a        2
          Cup   a        5
                b        3
Madrid    Cup   a        5
New York  Plate a        8
# data1.loc[('New York'),:]
            col4
col2  col3
Cup   a        3
      b        5
Plate a        8
      a        8
# data1.loc[('New York','Cup'),:]
      col4
col3
a        3
b        5
# data1.loc[idx[:,'Cup'],:]
                     col4
sites     col2 col3
New York  Cup  a        3
Madrid    Cup  a        2
New York  Cup  b        5
Madrid    Cup  b        9
Stockholm Cup  a        5
               b        3
Madrid    Cup  a        5

Если вы не хотите видеть какие-либо предупреждения и хотите сохранить высокую производительностьвсе вы можете использовать idx и явное кодирование, а именно:

data1.loc[idx['New York',:,:],:]
data1.loc[idx['New York','Cup',:],:]
data1.loc[idx['','Cup',:],:]

Ваш следующий шаг - записать эти выборки данных на отдельный лист. Я не очень знаком с этим, потому что я всегда записываю данные в текстовые файлы. Например, записать один из них в CSV-файл так же просто, как data1.loc[idx['New York','Cup',:],:].to_csv('result.csv',index=False). Я рекомендую вам поиск нужных вам функций. Надеюсь, это полезно. Удачи!

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