我想按ID分组搜索评论,然后将与ID关联的所有行替换为每个ID下显示的评论。
我当前的逻辑是用模式值替换与id关联的所有行,但是在某些情况下,注释不是模式(nan是)
这是我的代码:
file['name'] = file.groupby('data__id')['name'].apply(lambda x: x.fillna(x.mode()))
数据样本:
data__id name
1 yes
1
2
2 no
2
答案 0 :(得分:1)
这里mode
应该返回多个值,因此请先用Series.iat
进行索引选择:
df['name'] = df.groupby('data__id')['name'].apply(lambda x: x.fillna(x.mode().iat[0]))
print (df)
data__id name
0 1 yes
1 1 yes
2 2 no
3 2 no
4 2 no
如果得到:
IndexError:索引0超出了大小为0的轴0的边界
如果next
返回空的iter
,则使用mode
和Series
作为返回默认值,因为组仅包含缺少的值:
print (df)
data__id name
0 1 yes
1 1 NaN
2 2 NaN
3 2 no
4 2 NaN
5 3 NaN
f = lambda x: x.fillna(next(iter(x.mode()), np.nan))
df['name'] = df.groupby('data__id')['name'].apply(f)
print (df)
data__id name
0 1 yes
1 1 yes
2 2 no
3 2 no
4 2 no
5 3 NaN
或自定义值:
f = lambda x: x.fillna(next(iter(x.mode()), 'no match'))
df['name'] = df.groupby('data__id')['name'].apply(f)
print (df)
data__id name
0 1 yes
1 1 yes
2 2 no
3 2 no
4 2 no
5 3 no match
答案 1 :(得分:1)
我建议您使用transform
而不是apply
s=df.groupby('data__id')['name'].transform(lambda x: x.mode().iloc[0])
df.name.fillna(s,inplace=True)