【发布时间】:2020-04-14 05:49:13
【问题描述】:
使用 pandas,我有一个包含两个层次结构 A 和 B 的数据框,其中 B 可以是 NaN,我想以特定方式在 D 中填充一些 NaN:
在下面的示例中,A 具有“B 子组”,其中 D 根本没有值(例如 (1, 1)),而 A 在其他子组中也有 D 值(例如 (1, 3))。
现在我想得到每个子组的mean(120, 90 and 75 代表A==1),找到这些均值的median(90 代表A==1)并使用这个中值填充NaN A==1 的其他子组。
不应填充像 A==2 这样的组,其中 D 只有 NaN。
像A==3 这样的组,其中有一些 D 值,但只有 B 为 NaN 的行在 D 中具有 NaN,如果可能,不应填充(我打算稍后用 D 的所有值的平均值填充这些值他们的整个 A 组)。
示例 df:
d = {'A': [1, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3],
'B': [1, 2, 3, 3, 4, 5, 6, 1, 1, np.NaN, np.NaN],
'D': [np.NaN, np.NaN, 120, 120, 90, 75, np.NaN, np.NaN, 60, 50, np.NaN]}
df = pd.DataFrame(data=d)
A B D
1 1 NaN
1 2 NaN
1 3 120
1 3 120
1 4 90
1 5 75
1 6 NaN
2 1 NaN
3 1 60
3 NaN 50
3 NaN NaN
预期结果:
A B D
1 1 90
1 2 90
1 3 120
1 3 120
1 4 90
1 5 75
1 6 90
2 1 NaN
3 1 60
3 NaN 50
3 NaN NaN
使用df.groupby(['A', 'B'])['D'].mean().groupby(['A']).agg('median') 或.median() 我似乎得到了正确的值,但使用
df['D'] = df['D'].fillna(
df.groupby(['A', 'B'])['D'].mean().groupby(['A']).agg('median')
)
似乎没有改变 D 中的任何值。
非常感谢任何帮助,我已经被困了一段时间,无法在任何地方找到任何解决方案。
【问题讨论】:
-
您能否编写代码以生成示例 DataFrame,以便人们可以将其复制粘贴到控制台中并使用?
-
刚刚做了,尽管我的问题在此期间得到了回答。抱歉,我没有考虑到这一点。
标签: python pandas pandas-groupby nan fillna