【问题标题】:Pandas groupby: fill missing values from other group membersPandas groupby:填充其他组成员的缺失值
【发布时间】:2016-03-15 04:57:12
【问题描述】:

我认为最好用一个例子来说明这一点。我要做的是从组中找到非空数字并将其传播到组的其余部分。

In [52]: df = pd.DataFrame.from_dict({1:{'i_id': 2, 'i_num':1}, 2: {'i_id': 2, 'i_num': np.nan}, 3: {'i_id': 2, 'i_num': np.nan}, 4: {'i_id': 3, 'i_num': np.nan}, 5: {'i_id': 3, 'i_num': 5}}, orient='index')

In [53]: df
Out[53]:
   i_num  i_id
1      1     2
2    NaN     2
3    NaN     2
4    NaN     3
5      5     3

DataFrame 看起来像这样。我想要的是获取所有 i_id == 2 并使它们的 i_num == 1 和所有 i_id == 3,并使它们的 i_num == 5(因此都匹配它们的非空组邻居)。

所以最终的结果是这样的:

   i_num  i_id
1      1     2
2      1     2
3      1     2
4      5     3
5      5     3

【问题讨论】:

  • 如果给定的i_id 有多个唯一的i_num 怎么办?你如何选择然后填充哪个值?

标签: python pandas dataframe nan pandas-groupby


【解决方案1】:

first 查找组中的第一个非空值。您可以像这样填写每个组中的其他值:

df['i_num'] = df.groupby('i_id')['i_num'].transform('first')

这会根据需要生成列:

   i_num  i_id
1      1     2
2      1     2
3      1     2
4      5     3
5      5     3

请记住,这会将组中的所有值替换为第一个值,而不仅仅是 NaN 值(不过,这似乎正是您要在这里寻找的)。

或者 - 为了尊重组中的任何其他非空值 - 您可以通过以下方式使用 fillna

# make a column of first values for each group
x = df['i_id'].map(df.groupby('i_id')['i_num'].first())
# fill only NaN values using new column x
df['i_num'] = df['i_num'].fillna(x)

【讨论】:

    猜你喜欢
    • 2015-01-08
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    相关资源
    最近更新 更多