在pandas数据框中填充缺失值

3
我有一个pandas数据框,它有两列:locationid和geo_loc。locationid列中有缺失值。
我想获取缺失locationid行的geo_loc值, 然后在geo_loc列中搜索此geo_loc值并获取loction id。
df1 = pd.DataFrame({'locationid':[111, np.nan, 145, np.nan, 189,np.nan, 158, 145],
                     'geo_loc':['G12','K11','B16','G12','B22','B16', 'K11',he l 'B16']})
df

enter image description here

我需要最终输出如下:

enter image description here

locationid的第1个索引缺失,相应的geo_loc值为'K11'。我会在geo_loc列中查找这个值,并且索引6具有locationid 158。使用此值,我想填充索引1的缺失值。

我尝试了这些代码,但它们没有起作用。

df1['locationid'] = df1.locationid.fillna(df1.groupby('geo_loc')['locationid'].max())

df1['locationid'] = df1.locationid.fillna(df1.groupby('geo_loc').apply(lambda x: print(list(x.locationid)[0])))
1个回答

2
使用 GroupBy.transform 对于与原始大小相同且填充了聚合值 max 的 Series 进行操作:
df1['locationid']=df1.locationid.fillna(df1.groupby('geo_loc')['locationid'].transform('max'))
print (df1)
   locationid geo_loc
0       111.0     G12
1       158.0     K11
2       145.0     B16
3       111.0     G12
4       189.0     B22
5       145.0     B16
6       158.0     K11
7       145.0     B16

如果值是字符串,可以通过一个技巧来移除缺失的值。在 lambda 函数中使用 Series.dropna 来移除缺失值,然后对字符串进行词典排序比较。
df1 = pd.DataFrame({'locationid':[111, np.nan, 145, np.nan, 189,np.nan, 158, 145],
                     'geo_loc':['G12','K11','B16','G12','B22','B16', 'K11', 'B16']})

#sample data strings with missing values
df1['locationid'] = df1['locationid'].dropna().astype(str) + 'a'


df1['locationid']= (df1.groupby('geo_loc')['locationid']
                       .transform(lambda x: x.fillna(x.dropna().max())))

print (df1)
  locationid geo_loc
0     111.0a     G12
1     158.0a     K11
2     145.0a     B16
3     111.0a     G12
4     189.0a     B22
5     145.0a     B16
6     158.0a     K11
7     145.0a     B16

非常感谢 @jezrael。问题:如果 locationid 列中的值是字符串,'max' 还能起作用吗? - Adam Iqshan
@AdamIqshan - 不是的,会返回 TypeError: '>='不支持'str'和'float'实例之间的比较 - jezrael
@jezrel,在这种情况下我还能使用哪些代码行?非常感谢! - Adam Iqshan
1
@AdamIqshan - 已添加了解决方案。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接