pandas groupby对象中n和n + 1行之间的平均值?

Posted

技术标签:

【中文标题】pandas groupby对象中n和n + 1行之间的平均值?【英文标题】:Mean between n and n+1 row in pandas groupby object? 【发布时间】:2018-10-14 12:59:18 【问题描述】:

我有一个 groupby 对象:

  col1 col2         x         y         z
0    A   D1  0.269002  0.131740  0.401020
1    B   D1  0.201159  0.072912  0.775171
2    D   D1  0.745292  0.725807  0.106000
3    F   D1  0.270844  0.214708  0.935534
4    C   D1  0.997799  0.503333  0.250536
5    E   D1  0.851880  0.921189  0.085515

如何将 groupby 对象排序为以下:

  col1 col2         x         y         z
0    A   D1  0.269002  0.131740  0.401020
1    B   D1  0.201159  0.072912  0.775171
4    C   D1  0.997799  0.503333  0.250536
2    D   D1  0.745292  0.725807  0.106000
5    E   D1  0.851880  0.921189  0.085515
3    F   D1  0.270844  0.214708  0.935534

然后计算 A 行 x, y, z 和 B 行 x, y, z、B 行 x, y, z 和 C 行 x, y, z 之间的均值。 . 这样我就有了:

    col1 col2    x_mean    y_mean    z_mean
0    A-B   D1  0.235508  0.102326   0.58809
1    B-C   D1       ...       ...       ...
4    C-D   D1       ...       ...       ...
2    D-E   D1       ...       ...       ...
5    E-F   D1       ...       ...       ...
3    F-A   D1       ...       ...       ...

我基本上是在尝试通过计算找到六边形结构的顶点之间的中点(嗯......更像是 1000 万)。提示赞赏!

【问题讨论】:

【参考方案1】:

我相信您需要 groupbyrolling 并聚合 mean,最后一对使用 shift 并删除每个组的第一个 NaNs 行:

print (df)
 col1 col2         x         y         z
0    A   D1  0.269002  0.131740  0.401020
1    B   D1  0.201159  0.072912  0.775171
2    D   D1  0.745292  0.725807  0.106000
3    F   D2  0.270844  0.214708  0.935534 <-change D1 to D2
4    C   D2  0.997799  0.503333  0.250536 <-change D1 to D2
5    E   D2  0.851880  0.921189  0.085515 <-change D1 to D2
#
df = (df.sort_values(['col1','col2'])
        .set_index('col1')
        .groupby('col2')['x','y','z']
        .rolling(2)
        .mean()
        .reset_index())
df['col1'] = df.groupby('col2')['col1'].shift() + '-' + df['col1']
df = df.dropna(subset=['col1','x','y','z'], how='all')
#alternative
#df = df[df['col2'].duplicated()]
print (df)

  col2 col1         x         y         z
1   D1  A-B  0.235081  0.102326  0.588095
2   D1  B-D  0.473226  0.399359  0.440586
4   D2  C-E  0.924840  0.712261  0.168026
5   D2  E-F  0.561362  0.567948  0.510524

【讨论】:

是的! .rolling() 是我的问题的答案。

以上是关于pandas groupby对象中n和n + 1行之间的平均值?的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用sort_values函数和groupby函数获取每个分组数值最小的前N行数据(n rows with smallest column value in each group)

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用tail函数获取每个分组数据中每个分组的最后面N行样本

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用head函数获取每个分组数据中每个分组的最前面N行样本

Pandas Groupby 只取前 N 个组 [重复]

pandas GroupBy上的方法apply:一般性的“拆分-应用-合并”

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用nth函数获取每个分组数据中每个分组的第N+1个样本(N=0的时候为第一个样本)