2013-10-08 2 views
0

Я пытаюсь сохранить DataFrame, который я создал с помощью groupby, в файл excel с функцией to_excel. Когда я просматриваю данные в ноутбуке ipython, он появляется по желанию. Код GroupBy прост:Pandas: проблема с to_excel с использованием сгруппированной DataFrame

grouped = teach_freq.groupby(['Focal','follow','Activity']) 
    grouped.head() 

    <class 'pandas.core.frame.DataFrame'> 
    MultiIndex: 1797 entries, (10107.0, 192.0, ff, 25220.0) to (53704.0, 142.0, ss.rn, 18823.0) 
    Data columns (total 16 columns): 
    Epoch   1790 non-null values 
    follow  1797 non-null values 
    T_Opp   1797 non-null values 
    T_Dir   1797 non-null values 
    T_Enh   1797 non-null values 
    T_SocTol  1797 non-null values 

... и так далее dtypes: float64 (3), Int64 (6), объект (7)

to_excel код также прост:

grouped.to_excel('filename.xls', sheet_name='sheet1') 

Когда я запускаю этот последний код, только несколько строк данных попадают в файл excel (около 3 из почти 1800 строк данных. Я получаю предварительный просмотр другой части данных в ноутбуке ipython, который выглядит например:

Focal follow Activity  
    10107 192  ff    None 
    10212 187  rn.ss   None 
    194   hc    None 
        pa    None 
    10213 166  hr.hg   None 
        pa    None 
        sr.hg   None 
        sr.hl   None 

Эти данные представляют собой только 3 столбца, которые я сгруппировал, плюс столбец None, который не существует в моем фреймворке данных. В файле я получаю 6 строк правильно отформатированных данных, заголовков и всего. Если я буду следить за файлом, который записывается в Finder, размер изменяется вверх и вниз как строка кода to_excel, что, я думаю, предполагает, что он пишет небольшие фрагменты данных в файл за раз, записывая каждый со следующим.

Окончательный размер файла крошечный (6 КБ), но в некоторых случаях, когда код работает, он больше (до 32 КБ).

Наконец, последние несколько строк данных, отображаемых в данных ipython, представляют собой строки непосредственно перед теми, которые успешно записаны в файл excel, что предполагает, что по какой-то причине оно сохраняет только эти строки данных, прошли префикс предварительного просмотра ноутбука ipython. Я не уверен, почему кто-то хотел бы, чтобы это как функция, или почему она будет работать именно так.

Это странно, я надеюсь, кто-то может объяснить мне, почему это происходит. Я просмотрел документацию groupby и to_excel и посмотрел на кого-нибудь с аналогичной проблемой, но не нашел ее. Я использовал to_excel для dataframes с теми же данными, которые не сгруппированы, и у них не было подобных проблем. На самом деле я даже не понимаю, почему я получаю выходные данные в ноутбуке, поскольку в других случаях я использовал to_excel, я вижу только вывод в файле excel.

+0

Вы говорите: «Сохраните файл данных, который я создал с помощью groupby, в файл excel», но я не вижу этого в вашем коде. 'groupby' не возвращает' DataFrame', он возвращает объект DataFrameGroupBy', который, как я подозреваю, является проблемой. Чтобы убедиться, есть ли какой-нибудь код, который вы оставили? – DSM

+0

Нет, я не оставлял код - просто делал глупые ошибки начинающего. –

+4

Почти по определению, новички не могут совершать глупые ошибки: они новички. Требуется опыт глупых ошибок, накопление которых - это опыт. ; ^) – DSM

ответ

3

см полных документы here

Проблема заключается в том вы пытаетесь работать на DataFrameGroupby объекта, что позволяет некоторые действий на подстилающей DataFrame. Однако вам нужно, чтобы объект groupby создавал новый dataframe, do.

to_excel не должен работать (и в действительности в предстоящем выпуске 0,13 будет отключен).

In [1]: df = DataFrame({'X' : ['B', 'B', 'A', 'A'], 'Y' : [1, 2, 3, 4]}) 

In [2]: df 
Out[2]: 
    X Y 
0 B 1 
1 B 2 
2 A 3 
3 A 4 

In [3]: df.groupby('X') 
Out[3]: <pandas.core.groupby.DataFrameGroupBy object at 0x40523d0> 

In [4]: df.groupby('X').sum() 
Out[4]: 
    Y 
X 
A 7 
B 3 

In [5]: type(df.groupby('X').sum()) 
Out[5]: pandas.core.frame.DataFrame 

Так что вам нужно применить операцию агрегации (например, sum или использовать apply) к вашему сгруппированному кадру, который будет затем создать новый кадр, который вы можете to_excel.

+1

Это имеет смысл. Я полагаю, что я должен использовать код, который просто сортируется, если я хочу организовать по группам для вывода, но не применять какие-либо операции агрегации. Спасибо за ясное объяснение - тот факт, что какой-то выход сделал это в файле excel, заставил меня думать, что он должен работать так, как я предполагал, но, очевидно, нет. –

+0

yep .... если вы действительно хотите сгруппировать (вне excel), то вы также должны агрегировать, иначе сортировка - хороший компромисс – Jeff

0

Это лишь частичный ответ, но я обнаружил, что если я использую следующий код, функция to_excel работает правильно. Но это кажется несовместимым с типичным использованием to_excel, поэтому я все еще надеюсь, что кто-то сможет объяснить это мне.

grouped.head().to_excel('PREVIEW.xls') 

Он также не кажется, что это окончательное решение, как глава() не будет отображать все данные на большой файл. Я на самом деле немного смущен, почему это так, здесь. Но он работает, поэтому я собираюсь с ним и надеюсь, что кто-то может передать мне правильную документацию, чтобы я мог понять, почему это так.

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