首页 > 解决方案 > 如何仅考虑特定行来使用 groupby 计算中位数

问题描述

我有以下数据框:

df = pd.DataFrame({'A': [1, 2, 3, 4, 1, 2, 3, 4], 
                   'B': [1, 1, 1, 1, 2, 2, 2, 2],
                   'C': [np.nan, 1, 3, 5, 6, 2, np.nan, np.nan]})
   A  B    C
0  1  1  NaN
1  2  1  1.0
2  3  1  3.0
3  4  1  5.0
4  1  2  6.0
5  2  2  2.0
6  3  2  NaN
7  4  2  NaN

随之而来的是以下地图:

df_map = pd.DataFrame({'A': [1, 1, 2, 2, 3, 3, 4, 4],
                       'N': [2, 3, 1, 4, 2, 1, 3, 1]})
   A  N
0  1  2
1  1  3
2  2  1
3  2  4
4  3  2
5  3  1
6  4  3
7  4  1

我想做的是用定义的每个组填充NaN值,但只考虑对应于in 的行。meanBANdf_map

例如:

NaNat index0将用平均值填充,[1.0, 3.0]因为1指向[2, 3].

生成的数据框应如下所示:

   A  B    C
0  1  1  2.0 # mean of 1.0 and 3.0
1  2  1  1.0
2  3  1  3.0
3  4  1  5.0
4  1  2  6.0
5  2  2  2.0
6  3  2  4.0 # mean of 6.0 and 2.0
7  4  2  6.0 # mean of 6.0 and NaN

提前致谢!

标签: pythonpandas

解决方案


希望有人可以修复以使其更优雅,但这应该得到你想要的,使用多个merge's 和的组合map

fill_map = (df.merge(df_map, on='A')
            .merge(df, left_on=['B', 'N'], right_on=['B', 'A'], suffixes=('', '_'))
            .groupby(['B', 'A'])['C_'].mean())


df['C'] = df['C'].fillna(df[['B', 'A']].apply(tuple, axis=1).map(fill_map))

[出去]

   A  B    C
0  1  1  2.0
1  2  1  1.0
2  3  1  3.0
3  4  1  5.0
4  1  2  6.0
5  2  2  2.0
6  3  2  4.0
7  4  2  6.0

推荐阅读