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

时间:2017-01-11 11:33:30

标签: python pandas lookup

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

       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

我想要的是创建一个包含region的{​​{1}}的额外列,如果在数据中找不到父级,则默认为parent,例如:

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

但鉴于我的数据帧有1.68亿行,我非常害怕效率低下。有没有更好的方法呢?我查看了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) lookup,但我无法弄清楚如何处理数据框中可能get或不存在的ID。

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

2 个答案:

答案 0 :(得分:2)

您可以使用类似于字典的Series.map方法。 parent 列和 region 列中的值用作构成它的键和值。如果它们在它们之间共享公共索引,则进行映射。

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

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

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

答案 1 :(得分:1)

我们也可以使用合并,加入自己以匹配父母与estid:

z = pd.merge(x, x[['estid','region']],\
             left_on = 'parent',\
             right_on = 'estid',\
             how =  'left',\
             suffixes=('', '_parent')) #left join

del z['estid_parent'] #remove uneeded row

z['region_parent'] = z['region_parent'].replace({np.NaN:None}) #remove nans, same as other answer
z

    estid   parent  region  region_parent
0   1   NaN A   None
1   2   NaN B   None
2   3   1.0 A   A
3   4   1.0 B   A
4   5   2.0 C   B
5   6   2.0 C   B
6   7   8.0 A   None