python - 如何仅考虑特定行来使用 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 的行。mean
B
A
N
df_map
例如:
NaN
at 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
提前致谢!
解决方案
希望有人可以修复以使其更优雅,但这应该得到你想要的,使用多个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
推荐阅读
- reactjs - 从类组件中反应功能组件中的访问值
- android - 在 google map api 上更改 Android Cluster 的吸引力
- c# - 如何从 URL 调用中捕获参数
- python - 独立级联模型的高效 Python 实现
- javascript - 无法在 scss 中导入字体
- python-3.x - 如何使用默认列表和下拉菜单中的 1 个字典使 tkinter 组合框循环在课堂上工作?
- c# - odata nextLink 出现在每个响应中
- python - 模式匹配python,如何在python中使用矩阵?
- python - 迁移学习音频分类
- python - Python正确格式错误中的字符串到日期时间