Python универсальный индекс нарезки - PullRequest
0 голосов
/ 25 октября 2018

Надеюсь, что кто-то может помочь мне с логикой преобразования этой логики Excel в python

=IF(LEFT(A8,5)="Total",A9,I8)

Так что я ищу, чтобы найти все в диапазоне, а затем создать новый столбец с первым элементом в диапазоне,Проблема в том, что имена диапазонов могут меняться.

Текущее решение, которое я реализовал, - это преобразование столбца в индекс и выбор вручную по именам индекса, выполнив следующие действия:

Sales = df.loc['1000 - Cash and Equivalents':'Total - 1000 - Cash and Equivalents']

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

Это пример данных:

enter image description here

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

enter image description here

1 Ответ

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

Использование:

df = pd.read_csv('PL2.csv', encoding='cp1252', engine='python')


#create helper df for total strings
df1 = df.loc[df.iloc[:, 0].str.startswith('Total', na=False), df.columns[0]].to_frame('total')
#first column without Total - 
df1['first'] = df1['total'].str.replace('Total - ', '')
print (df1.head(10))
                                    total                          first
17                   Total - 4000 - Sales                   4000 - Sales
21  Total - 4200 - Discounts & Allowances  4200 - Discounts & Allowances
24       Total - 4400 - Excise and Duties       4400 - Excise and Duties
25                          Total - Sales                          Sales
37      Total - 5000 - Cost of Goods Sold      5000 - Cost of Goods Sold

#create index by first column
df = df.set_index(df.columns[0])

#filter function - if not matched return empty df
def get_dict(df, first, last):
    try:
        df = df.loc[first: last]
        df['Sub-Category'] = first
    except KeyError:
        df = pd.DataFrame()
    return df

#in dictionary comprehension create dict of DataFrames     
d = {k: get_dict(df, k, v) for k, v in zip(df1['first'], df1['total'])}
#print (d)

#select Sales df
print (d['Sales'])
...