首页 > 解决方案 > 如果关联 ID 的一部分匹配,则来自多行的平均值

问题描述

我有一个地下水模型输出文件,其中包含大约 200 口井的模拟水位。棘手的部分是,根据井跨越的模型层数(不同深度),井最多可以有 5 个值。需要对这些值进行平均,以便将它们与另一个数据框中的单个观察到的水位进行比较。每个孔都有一个 11 个字符的 ID(即 HARN0000219)。如果一口井有 4 层,则模型 ID 会在第一层之后为每个附加层进行调整(我无法控制模型输出文件的创建方式)。例如,一个有 4 层的井将有 4 个值,关联的 ID 将是:HARN0000219、HARN0000219.1、HARN0000219.2、HARN0000219.3。

如何通过基井 ID 计算平均水位?

示例数据框:

df = pd.DataFrame({
    'wl': [4568.35, 4538.85, 4156.48, 4156.54, 4156.59, 4156.61],
    'ID': ['GRAN0000800', 'HARN0000009', 'HARN0000219', 'HARN0000219.1', 'HARN0000219.2', 'HARN0000219.3']
})

我假设它会以这样的方式开始,但不知道从哪里开始。

for well, row in well_mod.iterrows():
    if # first 11 characters = next:
        # average all wl values

任何帮助将不胜感激!

标签: python-3.xpandas

解决方案


您需要创建一个新系列,其中包含该系列的相关前缀"ID"和分组。例如,

# take first 11 characters of ID
key = df['ID'].str[:11]

# average water level for each base ID
df.groupby(key)['wl'].mean()
ID
GRAN0000800    4568.350
HARN0000009    4538.850
HARN0000219    4156.555
Name: wl, dtype: float64

根据您的 ID 的结构,以下可能更合适。

# take everything from ID before the period
key = df['ID'].str.split('.').str[0]

推荐阅读