2015-07-06 2 views
3

Я заполняю DataFrame с помощью упорядоченного словаря, но pandas DataFrame в алфавитном порядке упорядочивает столбцы.Python 3.4: Pandas DataFrame не отвечает на упорядоченный словарь

код

labels = income_data[0:-1:4] 

    year1 = income_data[1:-1:4] 
    key = eachTicker 
    value = OrderedDict(zip(labels, year1)) 
    full_dict[key] = value 

    df = pd.DataFrame(full_dict) 

print(df) 

Как вы можете видеть ниже full_dict является Молнии словарь из нескольких списков, а именно: labels и year1

выход full_dict

print(full_dict) 
OrderedDict([('AAPL', OrderedDict([('Total Revenue', 182795000), ('Cost of Revenue', 112258000), ('Gross Profit', 70537000), ('Research Development', 6041000), ('Selling General and Administrative', 11993000), ('Non Recurring', 0), ('Others', 0), ('Total Operating Expenses', 0), ('Operating Income or Loss', 52503000), ('Total Other Income/Expenses Net', 980000), ('Earnings Before Interest And Taxes', 53483000), ('Interest Expense', 0), ('Income Before Tax', 53483000), ('Income Tax Expense', 13973000), ('Minority Interest', 0), ('Net Income From Continuing Ops', 39510000), ('Discontinued Operations', 0), ('Extraordinary Items', 0), ('Effect Of Accounting Changes', 0), ('Other Items', 0), ('Net Income', 39510000), ('Preferred Stock And Other Adjustments', 0), ('Net Income Applicable To Common Shares', 39510000)]))]) 

Выведенный DataFrame упорядочен в алфавитном порядке, и я не знаю, почему. Я хочу, чтобы заказать как в full_dict

вывода кода

          AAPL  AMZN  LNKD 
Cost of Revenue       112258000 62752000 293797 
Discontinued Operations       0   0  0 
Earnings Before Interest And Taxes  53483000  99000 31205 
Effect Of Accounting Changes     0   0  0 
Extraordinary Items        0   0  0 
Gross Profit        70537000 26236000 1924970 
Income Before Tax      53483000 -111000 31205 
Income Tax Expense      13973000 167000 46525 
Interest Expense        0 210000  0 
Minority Interest        0   0  -427 
Net Income        39510000 -241000 -15747 
Net Income Applicable To Common Shares 39510000 -241000 -15747 
Net Income From Continuing Ops   39510000 -241000 -15747 
Non Recurring         0   0  0 
Operating Income or Loss     52503000 178000 36135 
Other Items          0   0  0 
Others           0   0 236946 
Preferred Stock And Other Adjustments   0   0  0 
Research Development      6041000   0 536184 
Selling General and Administrative  11993000 26058000 1115705 
Total Operating Expenses      0   0  0 
Total Other Income/Expenses Net   980000 -79000 -4930 
Total Revenue       182795000 88988000 2218767 

ответ

3

Это похоже на ошибку в DataFrame CTOR в том, что он не уважает ключ порядка, когда ориентируют является «колонна» работа вокруг использовать from_dict и транспонировать результат при указании ориентируют как «индекс»:

In [31]: 
df = pd.DataFrame.from_dict(d, orient='index').T 
df 

Out[31]: 
              AAPL 
Total Revenue       182795000 
Cost of Revenue       112258000 
Gross Profit        70537000 
Research Development      6041000 
Selling General and Administrative  11993000 
Non Recurring         0 
Others           0 
Total Operating Expenses      0 
Operating Income or Loss     52503000 
Total Other Income/Expenses Net   980000 
Earnings Before Interest And Taxes  53483000 
Interest Expense        0 
Income Before Tax      53483000 
Income Tax Expense      13973000 
Minority Interest        0 
Net Income From Continuing Ops   39510000 
Discontinued Operations       0 
Extraordinary Items        0 
Effect Of Accounting Changes     0 
Other Items          0 
Net Income        39510000 
Preferred Stock And Other Adjustments   0 
Net Income Applicable To Common Shares 39510000 

EDIT

Исправлена ​​ошибка из-за линии 5746 в index.py:

def _union_indexes(indexes): 
    if len(indexes) == 0: 
     raise AssertionError('Must have at least 1 Index to union') 
    if len(indexes) == 1: 
     result = indexes[0] 
     if isinstance(result, list): 
      result = Index(sorted(result)) # <------ culprit 
     return result 

Когда он строит индекс, он извлекает ключ, используя result = indexes[0], но затем проверяет, если это список, и если да сортирует результат: result = Index(sorted(result)) это почему вы получаете этот результат.

Issue here

duplicate issue

+0

СПАСИБО ТАК МНОГО !! :-D –

+1

Не беспокойтесь, пожалуйста, не забудьте принять и перенести мой ответ, я собираюсь опубликовать сообщение о [github] (https://github.com/pydata/pandas/issues) об этом – EdChum

+0

@EdChum, вы очень познаваемы! И на самом деле я раньше просто менял порядок на основе ключей, отлично знал правду сейчас! +999 – Anzel

Смежные вопросы