Python 填充数据框中缺少的值
我有一个带有两列的熊猫数据框:locationid,geo_loc。 locationid列缺少值 我想获取缺少locationid行的geo_loc值, 然后在geo_loc列中搜索此geo_loc值并获取位置idPython 填充数据框中缺少的值,python,pandas,dataframe,machine-learning,data-science,Python,Pandas,Dataframe,Machine Learning,Data Science,我有一个带有两列的熊猫数据框:locationid,geo_loc。 locationid列缺少值 我想获取缺少locationid行的geo_loc值, 然后在geo_loc列中搜索此geo_loc值并获取位置id df1 = pd.DataFrame({'locationid':[111, np.nan, 145, np.nan, 189,np.nan, 158, 145], 'geo_loc':['G12','K11','B16','G12','B
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
我需要这样的最终输出:
locationid的索引1缺失,相应的地理位置值为“K11”。
我会在geo_loc列中查看这个“K11”,索引6的位置ID为158。用这个值
我想填充索引1中缺少的值
我试过这些代码,但都不起作用
df1['locationid'] = df1.locationid.fillna(df1.groupby('geo_loc')['locationid'].max())
用于与原始尺寸相同的系列,由聚合值填充max
:
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函数中使用“技巧-删除缺少的值”进行比较,字符串将按字典顺序进行比较:
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
谢谢你,杰兹雷尔。QQ:如果我在locationid列中有一个字符串值怎么办?“max”在这种情况下可以工作吗?@AdamIqshan-no,然后返回
TypeError:“>=”在“str”和“float”的实例之间不受支持
@jezrel在这种情况下我还可以使用什么代码行?非常感谢@AdamIqshan-为此添加了解决方案
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