【问题标题】:Fill missing values in pandas dataframe填充熊猫数据框中的缺失值
【发布时间】:2020-06-06 14:30:04
【问题描述】:

我有一个包含两列的 pandas 数据框: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','B22','B16', 'K11',he l 'B16']})
df

我需要这样的最终输出:

locationid 的索引 1 缺失,对应的 geo_loc 值为 'K11'。 我会在 geo_loc 列中查看这个“K11”,索引 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])))

【问题讨论】:

    标签: python pandas dataframe machine-learning data-science


    【解决方案1】:

    GroupBy.transform 用于与原始大小相同的系列,由聚合值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 函数中使用 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。 QQ:如果我在 locationid 列中有一个字符串值怎么办? 'max' 在这种情况下会起作用吗?
    • @AdamIqshan - 不,然后返回TypeError: '>=' not supported between instances of 'str' and 'float'
    • @jezrel 在这种情况下我可以使用哪些其他代码行?非常感谢!
    • @AdamIqshan - 为此添加了解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2017-08-21
    • 2019-08-01
    • 2021-12-10
    相关资源
    最近更新 更多