当查找值不存在或为空时 pandas 查找的默认值
Default value for pandas lookup when lookup value doesn't exist or is null
我有一个如下所示的数据框:
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
我想要的是创建一个包含 parent
的 region
的额外列,如果在数据中找不到父项,则默认为 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
以下return是正确的结果:
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)
但我非常害怕效率低下,因为我的数据框有 1.68 亿行。有更好的方法吗?我查看了 lookup
和 get
,但我不太清楚如何使用可以是 NaN
或不存在于数据框中的 ID。
例如,我认为这可行:df.lookup(df["region"], df["parent"])
,但它不太喜欢空键。 df.get("region")
不是 return 父区域,而是列本身,所以它不符合我的要求。
您可以使用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
我们也可以为此使用合并,加入自身以匹配 parents 到 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
我有一个如下所示的数据框:
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
我想要的是创建一个包含 parent
的 region
的额外列,如果在数据中找不到父项,则默认为 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
以下return是正确的结果:
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)
但我非常害怕效率低下,因为我的数据框有 1.68 亿行。有更好的方法吗?我查看了 lookup
和 get
,但我不太清楚如何使用可以是 NaN
或不存在于数据框中的 ID。
例如,我认为这可行:df.lookup(df["region"], df["parent"])
,但它不太喜欢空键。 df.get("region")
不是 return 父区域,而是列本身,所以它不符合我的要求。
您可以使用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
我们也可以为此使用合并,加入自身以匹配 parents 到 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