2015-02-09 3 views
0

Я готовлю рамку данных pandas для построения графика в g gplot2 R с ошибками, для чего требуется вычислить статистику столбцов. Для ошибок в барах требуется минимальное значение (среднее значение - стандартное отклонение) и максимальное значение (среднее значение + стандартное отклонение). Я получаю их с помощью GroupBy/AGG:подготовка кадров данных pandas для построения с ошибками

import pandas 
import numpy as np 

df = pandas.DataFrame({"id": ["a", "b", "c", "d"], 
         "exp": [10, 20, 30, 40], 
         "res1": [11, 22, 35, 42], 
         "res2": [9, 19, 32, 40], 
         "res3": [10.5, 20.8, 34, 48]}) 
# melt dataframe 
m = pandas.melt(df, id_vars=["id", "exp"]) 
# get mean/std 
summary = m.groupby("exp").agg([np.mean, np.std]) 
# add min and max under "value" 
summary[("value", "min")] = summary[("value", "mean")] - summary[("value", "std")] 
summary[("value", "max")] = summary[("value", "mean")] + summary[("value", "std")] 

Затем участок с R следующим образом:

# plot with R 
p = ggplot2.ggplot(m) + \ 
    ggplot2.geom_point(aes_string(x="exp", y="value", colour="variable"), data=m) 
    ggplot2.geom_errorbar(aes_string(x="exp", y="mean", ymin="min", ymax="max"), data=summary) 

Есть ли способ, чтобы упростить вычисление «мин»/«Макс» столбцы, так как это такая общая операция? Требуется ли создание отдельного фрейма данных («резюме» выше) или есть элегантный способ поместить ту же информацию в исходный расплавленный блок данных?

groupby возвращает иерархически индексированный dataframe, поэтому я поставил «mean» и «std» под «value» кажется слишком сложным.

ответ

1

Попробуйте выполнить ту же операцию без функции numpy .agg и используя встроенные функции .mean() и .std() в Pandas.

import pandas as pd 
import matplotlib.pyplot as plt 

df = pd.DataFrame({"id": ["a", "b", "c", "d"], 
        "exp": [10, 20, 30, 40], 
        "res1": [11, 22, 35, 42], 
        "res2": [9, 19, 32, 40], 
        "res3": [10.5, 20.8, 34, 48]}) 

m = pd.melt(df, id_vars=["id", "exp"]) 

mean = m.groupby("exp").mean() 

errors = m.groupby("exp").std() 

fig, ax = plt.subplots() 
mean.plot(yerr=errors, kind='bar') 

Вы должны получить следующий результат: enter image description here

+1

Есть ли эквивалент '' mean.plot (yerr = ошибки, вид = 'бар') '' в ggplot? – user248237dfsf

+0

Вы загружаете данные с помощью rpy2 или сохраняете данные в другом формате перед загрузкой в ​​R? – andrewwowens

+0

Кроме того, вот хороший пост при построении ошибки с ggplot2 - http://docs.ggplot2.org/0.9.3.1/geom_errorbar.html – andrewwowens

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