准备 pandas 个数据帧以使用错误条进行绘图
preparing pandas dataframes for plotting with errorbars
我正在准备一个 pandas 数据框,用于在 R 的 ggplot2 中绘制错误条,这需要计算列的统计信息。错误栏需要最小值(平均值 - 标准偏差)和
最大值(平均值 + 标准偏差)。我使用 groupby/agg:
得到这些
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)
有没有办法简化 "min"/"max" 列的计算,因为它是如此常见的操作?是否需要创建一个单独的数据框("summary" 以上),或者是否有一种优雅的方法可以将相同的信息放入原始融化的数据框中?
groupby returns 一个分层索引的数据框,所以我把 "mean" 和 "std" 放在 "value" 下似乎太复杂了。
尝试在没有 numpy .agg 函数的情况下执行相同的操作,并使用 Pandas.
中内置的 .mean() 和 .std() 函数
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')
您应该得到以下结果:
我正在准备一个 pandas 数据框,用于在 R 的 ggplot2 中绘制错误条,这需要计算列的统计信息。错误栏需要最小值(平均值 - 标准偏差)和 最大值(平均值 + 标准偏差)。我使用 groupby/agg:
得到这些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)
有没有办法简化 "min"/"max" 列的计算,因为它是如此常见的操作?是否需要创建一个单独的数据框("summary" 以上),或者是否有一种优雅的方法可以将相同的信息放入原始融化的数据框中?
groupby returns 一个分层索引的数据框,所以我把 "mean" 和 "std" 放在 "value" 下似乎太复杂了。
尝试在没有 numpy .agg 函数的情况下执行相同的操作,并使用 Pandas.
中内置的 .mean() 和 .std() 函数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')
您应该得到以下结果: