【问题标题】:Average over Grouped By Ids given an interval to Create new File给定创建新文件的时间间隔,按 Id 分组的平均值
【发布时间】:2021-05-06 00:37:20
【问题描述】:

我有一个 3D 数据集(Easting(X)、Northing(Y)、Elevation(Z))并且有某些有害元素的值,我们可以称之为 A、B、C。间隔是每 20 英尺,除非在Z 值的末尾可能会更小,因为它不能保证你会有偶数 20。

ID midX midY midZ From To Length A B C
AAA1 37710.9 102978.3 5727.2 40.0 60.0 20.0 0.284 7.5 0.010
AAA1 37697.7 102971.9 5713.5 60.0 80.0 20.0 0.051 2.4 0.005
AAA1 37684.6 102978.3 5708.2 80.0 100.0 20.0 0.284 7.5 0.010
AAA1 37684.6 102970.0 5694.5 100.0 120.0 20.0 0.153 6.5 0.150
AAA1 37684.6 102980.4 5683.8 120.0 140.0 20.0 0.648 5.4 0.222
AAA2 36979.0 106198.0 5763.0 0.0 20.0 20.0 0.051 2.1 0.045
AAA2 36979.0 106198.0 5743.0 20.0 40.0 20.0 0.145 8.4 0.111
AAA2 36979.0 106198.0 5723.0 40.0 58.7 18.7 0.742 0.4 0.043

我想使用这个数据集并制作一个新的数据集,该数据集在 40 秒而不是 20 秒上进行平均。如果没有一对,则只需输入最后一个值。它按 ID 平均。例如看起来像这样。

ID midX midY midZ From To Length A B C
AAA1 37704.3 102975.1 5720.35 40.0 80.0 40.0 0.1675 4.95 0.0075
AAA1 37684.6 102974.2 5701.35 80.0 120.0 40.0 0.2185 7.0 0.080
AAA1 37684.6 102980.4 5683.8 120.0 140.0 20.0 0.648 5.4 0.222
AAA2 36979.0 106198.0 5753.0 0.0 40.0 40.0 0.098 5.25 0.078
AAA2 36979.0 106198.0 5723.0 40.0 58.7 18.7 0.742 0.4 0.043
import pandas as  pd
phx =  pd.read_csv('./data.csv')
phx = phx.sort_values(['ID','midZ'],ascending=False).groupby('ID').head(3)

这将按 ID 和降序 midZ 对其进行排序,这正是我所需要的。下一步是在 step = 2 中平均,但如果有奇数,则保留最后一个。我一直在谷歌搜索并尝试各种事情,但它不起作用。我试过这个:

step = 2
phxdf = phx.groupby(phx.index//step).mean()

但这并没有给我我需要的东西。

任何帮助将不胜感激。蒂亚!

【问题讨论】:

  • 你所说的“40 岁平均”是什么意思。
  • 我想要 40 英尺的间隔,所以将 2 个 20 的距离从洞中取出,然后平均跑 40 英尺。

标签: python pandas sorting grouping average


【解决方案1】:

考虑在cumsum()Length 之后以40 的倍数为条件计算伪分组列,而numpy.ceil 则为上限倍数。然后,运行mean 聚合和groupby() 以及ID

数据

from io import StringIO
import numpy as np
import pandas as pd

txt = '''ID|midX|midY|midZ|From|To|Length|A|B|C
AAA1| 37710.9 | 102978.3 | 5727.2 | 40.0  | 60.0  | 20.0   | 0.284 | 7.5 | 0.010 
AAA1| 37697.7 | 102971.9 | 5713.5 | 60.0  | 80.0  | 20.0   | 0.051 | 2.4 | 0.005 
AAA1| 37684.6 | 102978.3 | 5708.2 | 80.0  | 100.0 | 20.0   | 0.284 | 7.5 | 0.010 
AAA1| 37684.6 | 102970.0 | 5694.5 | 100.0 | 120.0 | 20.0   | 0.153 | 6.5 | 0.150 
AAA1| 37684.6 | 102980.4 | 5683.8 | 120.0 | 140.0 | 20.0   | 0.648 | 5.4 | 0.222 
AAA2| 36979.0 | 106198.0 | 5763.0 |  0.0  | 20.0  | 20.0   | 0.051 | 2.1 | 0.045 
AAA2| 36979.0 | 106198.0 | 5743.0 | 20.0  | 40.0  | 20.0   | 0.145 | 8.4 | 0.111 
AAA2| 36979.0 | 106198.0 | 5723.0 | 40.0  | 58.7  | 18.7   | 0.742 | 0.4 | 0.043'''

df = pd.read_csv(StringIO(txt), sep="|")

聚合

df['grp_40'] = np.ceil(df.groupby(['ID'])['Length'].cumsum().div(40))
df['Length'] = df.groupby(['ID', 'grp_40'])['Length'].transform('sum')

agg = (df.groupby(['ID', 'grp_40'], sort=False, as_index=False)
         .mean()
         .drop('grp_40', axis='columns')
      )

print(agg)
#      ID     midX       midY     midZ   From     To  Length       A     B       C
# 0  AAA1  37704.3  102975.10  5720.35   50.0   70.0    40.0  0.1675  4.95  0.0075
# 1  AAA1  37684.6  102974.15  5701.35   90.0  110.0    40.0  0.2185  7.00  0.0800
# 2  AAA1  37684.6  102980.40  5683.80  120.0  140.0    20.0  0.6480  5.40  0.2220
# 3  AAA2  36979.0  106198.00  5753.00   10.0   30.0    40.0  0.0980  5.25  0.0780
# 4  AAA2  36979.0  106198.00  5723.00   40.0   58.7    18.7  0.7420  0.40  0.0430

【讨论】:

  • 让我试试这个,我会回复你的。谢谢!
  • 这在它总是 2 个重复的 ID 时有效,但是如果你有它,其中 AAA1 有 25 行,AAA2 有 12 行,等等?
  • 当我从代码中删除 .head(3) 时,它会中断:AttributeError: Cannot access callable attribute 'groupby' of 'DataFrameGroupBy' objects,尝试使用 'apply' 方法
  • 我又添加了几行。 @Parfait
  • 啊我没注意,刚试了一下,好像可以。谢谢!!!!
猜你喜欢
  • 2018-02-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 2019-08-01
  • 2018-05-29
相关资源
最近更新 更多