当查找值不存在或为 null 时 pandas 查找的默认值

Mik*_*ikk 3 python lookup pandas

我有一个如下所示的数据框:

       parent region
estid               
1         NaN      A
2         NaN      B
3         1.0      A
4         1.0      B
5         2.0      C
6         2.0      C
7         8.0      A
Run Code Online (Sandbox Code Playgroud)

我想要的是创建一个包含 的额外列regionparent默认为None如果在数据中找不到父级,例如:

       parent region parent_region
estid                             
1         NaN      A          None
2         NaN      B          None
3         1.0      A             A
4         1.0      B             A
5         2.0      C             B
6         2.0      C             B
7         8.0      A          None
Run Code Online (Sandbox Code Playgroud)

以下返回正确结果:

df["parent_region"] = df.apply(lambda x : df.loc[x["parent"]]["region"] if not math.isnan(x["parent"]) and x["parent"] in df.index else None, axis = 1)
Run Code Online (Sandbox Code Playgroud)

但鉴于我的数据帧有 1.68 亿行,我非常担心效率低下。有更好的方法吗?我查看了lookup和 ,get但我不太清楚如何使用NaN数据框中可能存在或不存在的 ID。

例如,我认为这可以工作:df.lookup(df["region"], df["parent"]),但它不太喜欢空键。df.get("region")不返回父级的区域,而是返回列本身,因此它不执行我想要的操作。

Nic*_*eli 6

您可以使用Series.map类似于字典的方法。来自父列和区域列的值用作构成它的键和值。如果它们之间共享公共索引,则映射就会发生。

此外,na_action=ignore可用于加速此映射过程,因为NaNs这些列中存在的所有内容都将被完全忽略并简单地传播。

None最后,必须使用 using方法替换缺失值Series.replace

df["parent_region"] = df.parent.map(df.region, na_action='ignore').replace({np.NaN:None})
Out[121]:
estid
1    None
2    None
3       A
4       A
5       B
6       B
7    None
Name: parent_region, dtype: object
Run Code Online (Sandbox Code Playgroud)