分组并替换某些值

时间:2019-07-18 14:08:43

标签: python pandas

我想按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 

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,则使用modeSeries作为返回默认值,因为组仅包含缺少的值:

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)