如何在pandas.dataframe中获取每个组的平均值,例如seaborn.factorplot

Zea*_*ker 2 python pandas seaborn

我有一个格式化为pandas数据框的数据集。请在seaborn http://seaborn.pydata.org/generation/seaborn.factorplot.html#seaborn.factorplot中查看此示例

>>> import seaborn as sns
>>> sns.set(style="ticks")
>>> exercise = sns.load_dataset("exercise")
>>> g = sns.factorplot(x="time", y="pulse", hue="kind", data=exercise)
Run Code Online (Sandbox Code Playgroud)

使用sns.factorplot,我可以按组看到数据的平均值(在本例中,图表显示了按“种类”在1/15/30分钟组的脉冲平均值)。

我想直接获取图表中的“值”。例如

time      kind     mean    standard deviation
1 min     running  xx      xx
15 min    running  xx      xx
Run Code Online (Sandbox Code Playgroud)

我可以使用2深度循环来获取所需的值,但我认为在熊猫中应该有一些简单的方法,因为这是常见的要求。

与matplotlib(它将返回绘图中的所有值)不同,seaborn返回Facetgrid对象。看来Facetgrid没有我想要的数据。

jez*_*ael 6

我认为您需要groupby按列timekindand 和:aggregate meanstd

print (exercise.groupby(['time','kind'])['pulse'].agg(['mean', 'std']))
#agg same as aggregate, only less typing ;)
#print (exercise.groupby(['time','kind'])['pulse'].aggregate(['mean', 'std']))
                 mean        std
time   kind                     
1 min  rest      90.2   6.545567
       walking   93.1   6.297266
       running   96.1   4.483302
15 min rest      90.9   6.118279
       walking   96.6   7.441625
       running  117.1  12.991023
30 min rest      91.4   5.337498
       walking   95.9   6.740425
       running  126.0  16.964014
Run Code Online (Sandbox Code Playgroud)
df1 = exercise.groupby(['time','kind'])['pulse'].agg(['mean', 'std']).reset_index()
print (df1)
     time     kind   mean        std
0   1 min     rest   90.2   6.545567
1   1 min  walking   93.1   6.297266
2   1 min  running   96.1   4.483302
3  15 min     rest   90.9   6.118279
4  15 min  walking   96.6   7.441625
5  15 min  running  117.1  12.991023
6  30 min     rest   91.4   5.337498
7  30 min  walking   95.9   6.740425
8  30 min  running  126.0  16.964014
Run Code Online (Sandbox Code Playgroud)