Pandas GroupBy 的绘图结果
Posted
技术标签:
【中文标题】Pandas GroupBy 的绘图结果【英文标题】:Plotting results of Pandas GroupBy 【发布时间】:2013-03-06 03:06:37 【问题描述】:我开始学习 Pandas,并试图找到最 Pythonic(或 Panda-thonic?)的方法来完成某些任务。
假设我们有一个包含 A、B 和 C 列的 DataFrame。
A 列包含布尔值:每一行的 A 值要么为真,要么为假。 B 列有一些我们想要绘制的重要值。我们想要发现的是 A 设置为 false 的行的 B 值与 A 设置为 true 的行的 B 值之间的细微差别。
换句话说,如何按 A 列的值(真或假)进行分组,然后在同一张图上绘制两组的 B 列值?这两个数据集应该用不同的颜色来区分这些点。
接下来,让我们为这个程序添加另一个功能:在绘图之前,我们要为每一行计算另一个值并将其存储在 D 列中。这个值是在 A 之前的整个五分钟内存储在 B 中的所有数据的平均值记录 - 但我们只包含存储在 A 中的具有相同布尔值的行。
换句话说,如果我有一行 A=True
和 time=t
,我想计算列 D 的值,它是从时间 t-5
到 @987654324 的所有记录的 B 的平均值@ 具有相同的A=True
。
在这种情况下,我们如何对 A 的值执行 groupby,然后将此计算应用于每个单独的组,最后绘制两个组的 D 值?
【问题讨论】:
你有一些示例数据框吗?看起来你可以做一些事情,比如将 groupby 对象保存在一个变量中:grouped = df.groupby('A')
,然后做一个 for 循环来绘制:for g, d in grouped: plot(d['B'], color=g)
。第二个问题或多或少相同,您可以在其中使用 pandas rolling_mean
创建新列 D。
【参考方案1】:
我认为@herrfz 达到了所有的高点。我只是充实细节:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
sin = np.sin
cos = np.cos
pi = np.pi
N = 100
x = np.linspace(0, pi, N)
a = sin(x)
b = cos(x)
df = pd.DataFrame(
'A': [True]*N + [False]*N,
'B': np.hstack((a,b))
)
for key, grp in df.groupby(['A']):
plt.plot(grp['B'], label=key)
grp['D'] = pd.rolling_mean(grp['B'], window=5)
plt.plot(grp['D'], label='rolling (k)'.format(k=key))
plt.legend(loc='best')
plt.show()
【讨论】:
这太完美了!您能否谈谈如何为 D 列实现更多自定义计算,如果说我想做一些内置“滚动”Pandas 函数未涵盖的专门计算?谢谢。 (@herrfz)rolling_mean
只是many rolling functions in Pandas 之一。要定义自定义滚动函数,请使用rolling_apply
。链接页面上有一个示例。
谢谢。我无法将该示例适应我想要完成的任务,所以我在这里问了另一个问题:***.com/questions/15487022/…以上是关于Pandas GroupBy 的绘图结果的主要内容,如果未能解决你的问题,请参考以下文章
在 pandas 中使用 groupby 命令后使用 seaborn 进行绘图
pandas使用groupby函数进行分组聚合使用get_group函数获取指定分组的数据(extract specific group after groupby in dataframe)