如何使用 Pandas 系列作为另一个系列的查找

How to use a Pandas series as a lookup for another series

对于两个系列:一个带有数字标识符,另一个是将这些标识符与名称相关联的查找,我如何加入它们?示例:

具有数字 ID 的系列

data_series = pd.Series(np.random.randint(0,100,5),
                        index = ["id_"+i for i in np.arange(5).astype('str')])
print(data_series)

id_0    38
id_1    35
id_2    36
id_3    32
id_4    94
dtype: int64

要查找名称的系列:

name_lookup_series = pd.Series(['Google','YouTube','Facebook','Baidu','Wikipedia'],
                        index=["id_"+i for i in np.arange(5).astype('str')])
print(name_lookup_series)

id_0       Google
id_1      YouTube
id_2     Facebook
id_3        Baidu
id_4    Wikipedia
dtype: object

想要的数据帧:

Google       38
YouTube      35
Facebook     36
Baidu        32
Wikipedia    94
dtype: int64

我可以通过破解 Pandas-fu 来做到这一点,但这是一个如此常见的 join-looking 操作,我认为有更惯用的方法来做到这一点。我目前的方法:

data_series.index = data_series.index.map(lambda x: name_lookup_series.loc[x])

是否有另一种方法可以做到这一点,最好是使用更简洁的代码并在一行中?

仅使用 rename - 因为使用 index:

s = data_series.rename(name_lookup_series)
#it is same as
#s = data_series.rename(index=name_lookup_series)
print (s)
Google       29
YouTube      57
Facebook     48
Baidu        16
Wikipedia    14
dtype: int32

另一种解决方案 - 有点复杂 - 是转换为 Seriesmap:

data_series.index = data_series.index.to_series().map(name_lookup_series)
print (data_series)
Google       29
YouTube      57
Facebook     48
Baidu        16
Wikipedia    14
dtype: int32

如果您的数据与其索引完全一致:

pd.concat((name_lookup_series, data_series), axis=1)
#               0   1
# id_0     Google  13
# id_1    YouTube   6
# id_2   Facebook  22
3 id_3      Baidu  77
# id_4  Wikipedia  42

如果它并不总是与索引对齐,则抛出 pd.Series.align。这很好地为您提供了一个可以传递给 .concat().

的元组
pd.concat(name_lookup_series.align(data_series), axis=1)
#               0   1
# id_0     Google  13
# id_1    YouTube   6
# id_2   Facebook  22
# id_3      Baidu  77
# id_4  Wikipedia  42