Pandas groupby:填补其他组成员的缺失值
Pandas groupby: fill missing values from other group members
我认为最好用一个例子来说明。我想要做的是从一个组中找到非空数字并将其传播到组的其余部分。
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
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)
我认为最好用一个例子来说明。我想要做的是从一个组中找到非空数字并将其传播到组的其余部分。
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
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)