如何在Seaborn绘图中直接实现group by与mean操作无需生成新DataFrame
问题解答
你想要的操作完全可以实现,不需要提前将分组聚合结果赋值为新的DataFrame/Series对象再传入Seaborn绘图接口。
Seaborn所有绘图接口的x、y参数都支持直接传入Pandas Index、Numpy数组、列表这类可迭代序列,data参数也支持直接传入临时计算得到的Series对象,不需要提前赋值给变量。
写法1:直接传入index和values(不适合超大数据集)
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt d = {'id': [1, 2, 3, 4, 5], 'month': [1, 2, 3, 4, 2], 'temperature': [20, 40, 50, 60, 20]} df = pd.DataFrame(data=d) # 无需定义中间变量,直接传入分组计算结果 sns.lineplot( x=df.groupby('month')['temperature'].mean().index, y=df.groupby('month')['temperature'].mean().values ) plt.show()
注意:该写法会执行两次
groupby聚合计算,数据量较大时会产生不必要的性能开销。
写法2:直接传入聚合后的Series(更简洁高效)
df.groupby('month')['temperature'].mean()本身返回的就是一个以month为索引的Series对象,Seaborn的绘图接口可以直接识别该结构,默认取索引为x轴、取值为y轴,代码可以简化为:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt d = {'id': [1, 2, 3, 4, 5], 'month': [1, 2, 3, 4, 2], 'temperature': [20, 40, 50, 60, 20]} df = pd.DataFrame(data=d) # 只执行一次groupby计算,无需中间变量 sns.lineplot(data=df.groupby('month')['temperature'].mean()) plt.show()
这个写法只执行一次分组聚合,性能和提前赋值中间变量的写法完全一致。
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

