如何用Pandas计算DataFrame连续行之间的平均值?
使用Pandas计算连续行平均值并实现居中绘图标签
当然可以!这在Pandas里实现起来相当简单,完全能满足你想要计算连续x轴位置的中间平均值、并把绘图标签放在两点中间的需求。
核心思路
要得到第2列中连续两行的平均值,我们可以利用Pandas的shift()函数对齐相邻行的数据,再进行均值计算。这样得到的结果刚好是两个原始x轴点的中间位置,直接就能用作绘图时的标签锚点。
具体实现步骤
- 创建示例数据
先模拟你的数据场景,假设第2列是x_pos(对应你说的30行数据,索引0-29):
import pandas as pd import matplotlib.pyplot as plt # 模拟x轴位置数据 df = pd.DataFrame({'x_pos': [0.21, 0.42, 0.55, 0.73, 0.91, 1.08, 1.22, 1.39, 1.55, 1.71, 1.88, 2.05, 2.21, 2.37, 2.54, 2.70, 2.86, 3.03, 3.19, 3.36, 3.52, 3.69, 3.85, 4.01, 4.18, 4.34, 4.51, 4.67, 4.84, 5.00]})
- 计算连续行的中间平均值
通过shift(-1)获取下一行的x_pos值,和当前行取平均,就能得到两点的中间位置:
# 计算相邻两行的平均值,生成新列x_mid df['x_mid'] = (df['x_pos'] + df['x_pos'].shift(-1)) / 2 # 最后一行没有下一行数据,会生成NaN,直接删除该行 df = df.dropna(subset=['x_mid'])
此时x_mid列的第一个值就是(0.21+0.42)/2=0.31,完全符合你的示例需求。
- 绘图时使用中间位置作为标签锚点
假设你有对应的y值数据,绘图时把x_mid作为x轴的位置,再设置对应的标签即可:
# 模拟y值数据(和x_mid行数对应,共29行) df['y_values'] = [5, 8, 6, 9, 12, 10, 14, 11, 15, 17, 13, 16, 19, 18, 22, 20, 23, 21, 25, 24, 27, 26, 29, 28, 31, 30, 33, 32, 35] # 绘制柱状图(宽度根据你的x轴间隔调整) plt.bar(df['x_mid'], df['y_values'], width=0.15) # 设置x轴标签,这里用原始x_pos的区间作为标签示例 plt.xticks(df['x_mid'], labels=[f"{a:.2f}-{b:.2f}" for a, b in zip(df['x_pos'], df['x_pos'].shift(-1).dropna())], rotation=45) plt.xlabel("X轴中间位置") plt.ylabel("Y值") plt.title("标签居中的X轴绘图示例") plt.tight_layout() plt.show()
额外说明
- 如果你的数据不需要删除NaN行,也可以尝试
df['x_mid'] = df['x_pos'].rolling(window=2).mean().shift(-0.5),但shift(-1)的方法更直观易懂,适合新手快速上手。 - 绘图时的
width参数需要根据你x轴数据的间隔来调整,确保柱子不会重叠或过于分散。
内容的提问来源于stack exchange,提问作者Claudiu Creanga
相关产品推荐
相关产品推荐

