【问题标题】:How to fill NAs with median of means of 2-column groupby in pandas?如何在熊猫中用 2 列 groupby 的平均值填充 NA?
【发布时间】:2020-04-14 05:49:13
【问题描述】:

使用 pandas,我有一个包含两个层次结构 AB 的数据框,其中 B 可以是 NaN,我想以特定方式在 D 中填充一些 NaN:

在下面的示例中,A 具有“B 子组”,其中 D 根本没有值(例如 (1, 1)),而 A 在其他子组中也有 D 值(例如 (1, 3))。

现在我想得到每个子组的mean120, 90 and 75 代表A==1),找到这些均值的median90 代表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


【解决方案1】:

您的第一步是正确的。之后,我们使用Series.map 将正确的中位数映射到A 列中的每个组。

最后我们使用np.where有条件地填写D列 if B is not NaN:

medians = df.groupby(['A', 'B'])['D'].mean().groupby(['A']).agg('median')
df['D'] = np.where(df['B'].notna(),                        # if B is not NaN
                   df['D'].fillna(df['A'].map(medians)),   # fill in the median
                   df['D'])                                # else keep the value of column D
    A    B      D
0   1 1.00  90.00
1   1 2.00  90.00
2   1 3.00 120.00
3   1 3.00 120.00
4   1 4.00  90.00
5   1 5.00  75.00
6   1 6.00  90.00
7   2 1.00    nan
8   3 1.00  60.00
9   3  nan  50.00
10  3  nan    nan

【讨论】:

  • 这似乎已经完成了工作,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2018-08-16
  • 2023-02-17
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
相关资源
最近更新 更多